我有一个数据库表如下。数据采用
树的形式 CREATE TABLE IF NOT EXISTS DOMAIN_HIERARCHY (
COMPONENT_ID INT NOT NULL ,
LEVEL INT NOT NULL ,
COMPONENT_NAME VARCHAR(127) NOT NULL ,
PARENT INT NOT NULL ,
PRIMARY KEY ( COMPONENT_ID )
);
表格中列出了以下数据
(1,1,'A',0)
(2,2,'AA',1)
(3,2,'AB',1)
(4,3,'AAA',2)
(5,3,'AAB',2)
(6,3,'ABA',3)
(7,3,'ABB',3)
我必须检索数据并存储在python词典中
在下面的代码中
conx = sqlite3.connect( 'nameofdatabase.db' )
curs = conx.cursor()
curs.execute( 'SELECT COMPONENT_ID, LEVEL, COMPONENT_NAME, PARENT FROM DOMAIN_HIERARCHY' )
rows = curs.fetchall()
hrcy = {}
for row in rows:
entry = ( row[2], {} )
cmap[row[0]] = entry
if row[1] == 1:
hrcy = {entry[0]: entry[1]}
hrcy['status'] = 0
for row in rows:
item = cmap[row[0]]
parent = cmap.get( row[3], None )
if parent:
parent[1][row[2]] = item[1]
parent[1]['status'] = 0
print json.dumps( hrcy, indent = 4 )
输出就像
{
"status": 0,
"A": {
"status": 0,
"AA": {
"status": 0,
"AAA": {},
"AAB": {}
},
"AB": {
"status": 0,
"ABA": {},
"ABB": {}
}
}
}
我希望输出像
{
"component": "A",
"status": 0,
"children": [
{
"component": "AA",
"status": 0,
"children": [
{
"component": "AAA",
"status": 0,
"children": []
},
{
"component": "AAB",
"status": 0,
"children": []
}
]
},
{
"component": "AB",
"status": 0,
"children": [
{
"component": "ABA",
"status": 0,
"children": []
},
{
"component": "ABB",
"status": 0,
"children": []
}
]
}
]
}
任何人都可以告诉我应该做出哪些改变吗?
答案 0 :(得分:1)
只需构建你想要的词汇,而不是其他东西:
for row in rows:
entry = {"component": row[2],
"children": [],
"status": 0}
cmap[row[0]] = entry
if row[1] == 1:
hrcy = entry
for row in rows:
item = cmap[row[0]]
parent = cmap.get( row[3], None )
if parent:
parent["children"].append(item)
答案 1 :(得分:1)
我会选择这样的东西:
import pprint
class Node(dict):
def __init__(self, *args):
dict.__init__(self)
self['id'] = args[0]
self['group'] = args[1]
self['component'] = args[2]
self['parent'] = args[3]
self['status'] = 0
self['children'] = []
def add_node(self, node):
for child in self['children']:
if child.is_parent(node):
child.add_node(node)
break
else:
self['children'].append(node)
def is_parent(self, node):
return node['component'].startswith(self['component'])
class RootNode(Node):
def __init__(self):
Node.__init__(self, *[0, 0, "Root", -1])
def is_parent(self, node):
return True
def make_tree(nodes):
root = RootNode()
for data in nodes:
node = Node(*data)
root.add_node(node)
return root
nodes = [
(1, 1, 'A', 0),
(2, 2, 'AA', 1),
(3, 2, 'AB', 1),
(4, 3, 'AAA', 2),
(5, 3, 'AAB', 2),
(6, 3, 'ABA', 3),
(7, 3, 'ABB', 3),
]
if __name__ == "__main__":
tree = make_tree(nodes)
pprint.pprint(tree['children'][0])
<强> OUTOUT 强>
{'children': [{'children': [{'children': [],
'component': 'AAA',
'group': 3,
'id': 4,
'parent': 2,
'status': 0},
{'children': [],
'component': 'AAB',
'group': 3,
'id': 5,
'parent': 2,
'status': 0}],
'component': 'AA',
'group': 2,
'id': 2,
'parent': 1,
'status': 0},
{'children': [{'children': [],
'component': 'ABA',
'group': 3,
'id': 6,
'parent': 3,
'status': 0},
{'children': [],
'component': 'ABB',
'group': 3,
'id': 7,
'parent': 3,
'status': 0}],
'component': 'AB',
'group': 2,
'id': 3,
'parent': 1,
'status': 0}],
'component': 'A',
'group': 1,
'id': 1,
'parent': 0,
'status': 0}