2017-08-24 97 views
1

我試圖從字典中使用Python將數據添加到MySQL表中。我的字典由與不同長度的值列表相關聯的鍵組成 - 長度從1到150左右。我使用插入語句將我的數據插入到表中鍵是字段名稱的表中。這是想要我的SQL INSERT語句是基本上是:在不同長度的列表中迭代

INSERT INTO table 
(key1, key2, key3, ...) 
VALUES 
(key1value1, key2value1, key3value1, ...), 
(key1value2, key2value2, key3value2, ...), 
(key1value3, key2value3, key3value3, ...); 

等等,但我也沒關係,以便做一個for循環讓每個組值的一個INSERT語句。這裏就是我有我的名單的第一要素:

cols = dict.keys() 
vals = dict.values() 
lst = [item[0] for item in vals] 
sql = "INSERT INTO table (%s) VALUES (%s);" % (','.join(map(str, cols[:len(cols)])), "'{}'".format("','".join(lst))) 
cursor.execute(sql) 

而且這樣的作品,有效地將我的第一組數據到我的表一個新行。但問題是,當我試圖增加索引,例如項目[1],它說索引超出範圍,因爲我有一些列表只有一個元素。由於這些列表的長度都不相同,所以我需要使這個列表足夠通用,以便每個列表都有很多元素。

如果索引超出範圍,因爲它增加了一些列表,我希望它跳過這些,但繼續插入其餘的。我怎麼做?

+1

請注意:修改查詢時使用預處理語句而不是字符串格式。 – MSeifert

回答

0

第一個例子會給你字典中每個值的ith元素,當最短的列表被用盡時完全停止。

第二個示例將繼續,只需使用None值,其中一個列表太短。

from itertools import zip_longest 

d = {'k1':[1,2,3], 
    'k2':[1,2,3,4,5,6], 
    'k3':[1,8]} 

for k in d.keys(): 
    for v in zip(*d.values()): 
     print(k,v) 

for k in d.keys(): 
    for v in zip_longest(*d.values()): 
     print(k,v) 
0
data = { 'a': [1], 'b': [1, 2], 'c': [1, 2, 3] } 

keys = ', '.join(data.keys()) 
values = ', '.join('(' + ', '.join(v) + ')' for v in (map(str, value) for value in data.values())) 

print(keys) 
print(values) 

產地:

a, b, c 
(1), (1, 2), (1, 2, 3) 

我相當肯定SQL不允許多個值一列,但。