我有一个列表的列表,例如[['a','b'],['c','d']]
我有一个名为表T
和两个字段F1
, F2
。 在字段列表中的第一项映射到F1
,第二至F2
。
我怎样才能插入每个内部列表中的行一个命令或调用,而不是使用像这样循环?
for i in [['a','b'],['c','d']]:
c.execute("insert into T (F1,F2) values (%s, %s)", (i[0], i[1]))
我有一个列表的列表,例如[['a','b'],['c','d']]
我有一个名为表T
和两个字段F1
, F2
。 在字段列表中的第一项映射到F1
,第二至F2
。
我怎样才能插入每个内部列表中的行一个命令或调用,而不是使用像这样循环?
for i in [['a','b'],['c','d']]:
c.execute("insert into T (F1,F2) values (%s, %s)", (i[0], i[1]))
从MySQLdb的用户指南 :
c.executemany(
"""INSERT INTO breakfast (name, spam, eggs, sausage, price)
VALUES (%s, %s, %s, %s, %s)""",
[
("Spam and Sausage Lover's Plate", 5, 1, 8, 7.95 ),
("Not So Much Spam Plate", 3, 2, 0, 3.95 ),
("Don't Wany ANY SPAM! Plate", 0, 4, 3, 5.95 )
] )
所以你的情况:
c.executemany("insert into T (F1,F2) values (%s, %s)",
[('a','b'),('c','d')])
它可以插入所有行像@adamhajari一个单独的语句,避免像@zenpoy SQL注入,在同一时间。 你只需要创建一个大的INSERT语句,让MySQLdb的的execute
做了格式化。
values_to_insert = [('a','b'),('c','d')]
query = "INSERT INTO T (F1, F2) VALUES " + ",".join("(%s, %s)" for _ in values_to_insert)
flattened_values = [item for sublist in values_to_insert for item in sublist]
c.execute(query, flattened_values)
不是超级可读的,但也可以是比executemany稍快(我想的50000行插入批次在本地DB,executemany较慢20%)。