1

我有一个如下的数据库表。数据采用树的形式

            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()

                cmap = {}
                for row in rows:
                    cmap[row[0]] = row[2]
                hrcy={}
                for level in range( 1, maxl + 1 ):
                    for row in rows:
                        if row[1] == level:
                            if hrcy == {}:
                                hrcy[row[2]] = []
                                continue
                            parent = cmap[row[3]]
                            hrcy[parent].append( { row[2]: [] } )

我面临的问题是超过 2 级的节点,它们被添加到根而不是它们的父级;我应该在哪里更改代码?

4

1 回答 1

2

问题是插入后无法直接看到第二级的节点。试试这个:

conx = sqlite3.connect( 'nameofdatabase.db' )
curs = conx.cursor()
curs.execute( 'SELECT COMPONENT_ID, LEVEL, COMPONENT_NAME, PARENT ' +
              'FROM DOMAIN_HIERARCHY' )
rows = curs.fetchall()
cmap = {}
hrcy = None
for row in rows:
    entry = (row[2], {})
    cmap[row[0]] = entry
    if row[1] == 1:
        hrcy = {entry[0]: entry[1]}

# raise if hrcy is None

for row in rows:
    item = cmap[row[0]]
    parent = cmap.get(row[3], None)
    if parent is not None:
        parent[1][row[2]] = item[1]

print hrcy

通过将每个组件的子组件映射保存在 中cmap,我总是可以到达每个父映射以将下一个组件添加到其中。我用以下测试数据进行了尝试:

rows = [(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)]       

输出是这样的:

{'A': {'AA': {'AAA': {}, 'AAB': {}}, 'AB': {'ABA': {}, 'ABB': {}}}}
于 2013-03-15T05:52:48.143 回答