2013-03-15 4 views
1

У меня есть таблица базы данных следующим образом. Данные в виде дерева сВставить дерево данных, взятых из базы данных в словарь python

  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) 

я получить данные и хранить в словаре питона

Я написал ниже кода

   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-го уровня, они добавляются к корню вместо родителя; где мне следует изменить код?

ответ

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': {}}}} 
+0

Это работает !!! Большое спасибо Дон Криби :) – Praneeth

Смежные вопросы