banner
李大仁博客

李大仁博客

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

[Python]PostgreSQL字典/JSON類型遞歸自展開

PostgreSql 習慣上會將特殊數據類型的各個節點按字典 / JSON 類型存儲 程式中需要獲得完整的數據信息的時候,需要對這個節點進行自展開。

以下使用 global 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())

其他玩法

# Global 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"
}
}
]
}

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。