2017-08-24 24 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不允许多个值一列,但。