2016-10-12 1 views
0

Я обработал очень большой словарь после обработки XML-файла, и я ищу извлечение из этого словаря и вставлять столбцы и значения в таблицу mySQL.Вложенный словарь Python с вставкой SQL

Я использую Python 3.

Словарь вложенная; вот простейший пример того, что у меня есть:

d ={'Test1'{'TestID':'first','Dev_Type':'this device','Version':'v1_0','Address':'some Address'} 
    'Test2'{'TestID':'second','Dev_Type':'that device','Version':'v1_0','Address':'other Address'} 
    'Test3'{'TestID','third','Dev_Type':'other device','Version':'v1_0','Address':'another Address'} 
} 

По существу я хочу перебрать каждый первичный ключ в этом словаре (например Test1, Test2, Test3) и извлечение вторичных ключей в качестве имени столбца кортежа и связанных с ним среднеспециальным ключевые значения как значения кортежа, немного как это:

cols = ('TestID','Dev_Type','Version','Address') 
vals = ('first','this device','v1_0','some Address') 

на итерация каждого первичного ключа Я добавлю два кортежа в мой MySql таблицу, используя следующую команду:

sql = "INSERT INTO Parameters ({0}) VALUES ({1})".format(', '.join(cols), ', '.join(['%s'] * len(cols))); 
try: 
    cursor.execute(sql, vals) 
except Exception as e: 
    print(e) 
    pass 

Затем повторите процесс на следующем первичном ключе ('Test2').

я сделал первую попытку, но жёстко первичного ключа в этом случае:

for k, v in d: 
    #Missing appropriate method here 
    cols = tuple(d['Test1'].keys()) 
    vals = tuple(d['Test1'].values()) 

    sql = "INSERT INTO Parameters ({0}) VALUES ({1})".format(', '.join(cols), ', '.join(['%s'] * len(cols))); 
    try: 
     cursor.execute(sql, vals) 
    except Exception as e: 
     pass 

connection.close() 
return 
+0

Это тангенциально, но вы должны использовать замену параметров API базы данных для защиты от инъекций SQL: https://docs.python.org/2/library/sqlite3.html#sqlite3.Cursor.execute –

+0

Вы имели в виду не указывайте ':' между ключами и значениями в вашем примере dict? –

ответ

2

Вы можете итерацию над d.values() и использовать .keys() и .values() метод на вложенных словарях, чтобы получить столбцы и значения:

for v in d.values(): 
    cols = v.keys() 
    vals = v.values() 

    sql = "INSERT INTO Parameters ({}) VALUES ({})".format(
     ', '.join(cols), 
     ', '.join(['%s'] * len(cols))); 
    try: 
     cursor.execute(sql, vals) 
    except Exception as e: 
     pass 

Обратите внимание, что в Python 3 dict.keys() и dict.values() возврата просмотров из дикции ary ключи и значения (в отличие от списков в Python 2).

+0

Есть ли какие-либо гарантии, что 'v.values ​​() 'всегда будет в том же порядке, что и список ключей' list (v) '? Кроме того, вы будете вставлять неправильные значения в несоответствующие столбцы. –

+0

Здесь [is] (https://docs.python.org/3/library/stdtypes.html#dictionary-view-objects) такая гарантия для 'd.keys() 'и' d.values ​​() '. Однако не упоминается 'list (d)'. –

+0

Да, это выглядит лучше –

0

Итерация по словарю фактически выполняется по клавишам. for k in d: эквивалентен for k in d.keys():. Вы ищете values или items методов, которые фактически возвращают ключ и значение в виде кортежа:

for k, v in d.items(): 
    # k will take the values 'Test1', 'Test2', etc. 
    # v will take the values of the corresponding nested dicts. 

или

for v in d.values(): 
    # v will take on the values of the nested dicts. 

Я бы рекомендовал использовать items над values с того, как вы будете имеют ссылку на какой первичный ключ (тест), который вы обрабатываете. Я собираюсь выйти на конечность здесь и предположить, что вам понадобится это для нетривиальной версии вашей программы.

Оттуда вы используете v как вы пытаетесь использовать d[...], так как это именно то, что это:

for k, v in d.items(): 
    cols = v.keys() 
    vals = v.values() 

    sql = "INSERT INTO Parameters ({0}) VALUES ({1})".format(
       ', '.join(cols), 
       ', '.join(['%s'] * len(v)) 
    ) 

    try: 
     cursor.execute(sql, vals) 
    except Exception as e: 
     pass 

connection.close() 
return 

С v вложенная словарь, вы можете получить количество элементов в обоих cols и vals как только len(v).

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