banner
李大仁博客

李大仁博客

天地虽大,但有一念向善,心存良知,虽凡夫俗子,皆可为圣贤。

[Python] PostgreSQLの辞書/JSON型の再帰的な展開

PostgreSQL では、通常、特殊なデータ型の各ノードを辞書 / JSON 型で保存します。プログラム内で完全なデータ情報を取得する必要がある場合、このノードを自己展開する必要があります。

以下では、グローバル ID 方式を使用して展開します。これは、SQL と NoSQL を組み合わせたシステムに一般的に適用されます。

import sys, os
import numpy as np

def get_object_by_gid(id):
    for dict in data["json"]:
        if dict["gid"] == id:
            return dict.copy()

def self_exact_node(key):
    dict = get_object_by_gid(key)
    for k,v in dict.items():
        if k == "sub_item" :
            item_arr = []
            for id in v["gids"]:
                item_arr.append(self_exact_node(id))
            v["item_arr"] = item_arr.copy()
    return dict

def demo():
    data_exact = data.copy()
    for d in data_exact["json"]:
        d = self_exact_node(d["gid"])

def main():
    demo()

if __name__ == '__main__':
    sys.exit(main())

その他の方法

# グローバル ID 方式
"gid": "大分类 2: 中分类 2: 子分类 2",

複合 ID#

"id":{"l1_cat":"大分类 1","l2_cat":"中分类 2","l3_cat":"子分类 2"}

リンクリスト方式#

"chain":{"next_gid":"","pre_gid":"","head_gid":"","tail_gid":""}

二分木方式#

"btree":{"next_sibling":"","child":""}

テスト用データ

data = {
    "json": [{
            "gid": "大分类1",
            "sub_item": {
                "gids": ["大分类1:中分类1", "大分类1:中分类2"]
            },
            "values": {
                "k1": "1000"
            }
        },
        {
            "gid": "大分类2",
            "sub_item": {
                "gids": ["大分类2:中分类1", "大分类2:中分类2"]
            },
            "values": {
                "k1": "2000"
            }
        },

        {
            "gid": "大分类1:中分类1",
            "sub_item": {
                "gids": ["大分类1:中分类1:子分类1", "大分类1:中分类1:子分类2"]
            },
            "values": {
                "k1": "1100"
            }
        },
        {
            "gid": "大分类1:中分类2",
            "sub_item": {
                "gids": ["大分类1:中分类1:子分类1", "大分类1:中分类1:子分类2"]
            },
            "values": {
                "k1": "1200"
            }
        },

        {
            "gid": "大分类2:中分类1",
            "sub_item": {
                "gids": ["大分类2:中分类1:子分类1", "大分类2:中分类1:子分类2"]
            },
            "values": {
                "k1": "2100"
            }
        },
        {
            "gid": "大分类2:中分类2",
            "sub_item": {
                "gids": ["大分类2:中分类2:子分类1", "大分类2:中分类2:子分类2"]
            },
            "values": {
                "k1": "2200"
            }
        },

        {
            "gid": "大分类1:中分类1:子分类1",
            "sub_item": {
                "gids": []
            },
            "values": {
                "k1": "1110"
            }
        },
        {
            "gid": "大分类1:中分类1:子分类2",
            "sub_item": {
                "gids": []
            },
            "values": {
                "k1": "1120"
            }
        },
        {
            "gid": "大分类1:中分类2:子分类1",
            "sub_item": {
                "gids": []
            },
            "values": {
                "k1": "1210"
            }
        },
        {
            "gid": "大分类1:中分类2:子分类2",
            "sub_item": {
                "gids": []
            },
            "values": {
                "k1": "1220"
            }
        },

        {
            "gid": "大分类2:中分类1:子分类1",
            "sub_item": {
                "gids": []
            },
            "values": {
                "k1": "2110"
            }
        },
        {
            "gid": "大分类2:中分类1:子分类2",
            "sub_item": {
                "gids": []
            },
            "values": {
                "k1": "2120"
            }
        },
        {
            "gid": "大分类2:中分类2:子分类1",
            "sub_item": {
                "gids": []
            },
            "values": {
                "k1": "2210"
            }
        },
        {
            "gid": "大分类2:中分类2:子分类2",
            "id":{"l1_cat":"大分类1","l2_cat":"","l3_cat":""}
            "sub_item": {
                "gids": []
            },
            "values": {
                "k1": "2220"
            }
        },

{
            "gid": "大分类2:中分类2:子分类2",
            /\*複合ID\*/
            "id":{"l1_cat":"大分类1","l2_cat":"中分类2","l3_cat":"子分类2"}
            /\*リンクリスト方式\*/
            "chain":{"next_gid":"","pre_gid":"","head_gid":"","tail_gid":""}
            /\*二分木方式\*/
            "btree":{"next_sibling":"","child":""}
            "sub_item": {
                "gids": []
            },
            "values": {
                "k1": "2220"
            }
        }
    ]
}
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。