我有一个列表列表,例如[['a','b'],['c','d']]
.
我有一个名为的表T
和两个字段F1
,F2
. 字段列表中的第一项映射到F1
,第二个映射到F2
。
如何在单个命令或调用中为每个内部列表插入行,而不是使用这样的 for 循环?
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 循环?
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 注入。您只需要创建一个大的插入语句并让 mysqldbexecute
进行格式化。
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 行的批次,executemany 慢了 20%)。
def multiple_insert(cursor, table, cols, rows):
sql_insert = 'INSERT INTO %s(%s) values %s' % (
table,
','.join(cols),
','.join('(%s , %s)' for _ in rows)
)
values = [_ for r in rows for _ in r]
cursor.execute(sql_insert, values)
# eg:
rows = [(a1 , b1),(a2 , b2),(a3 , b3)]
multiple_insert(cursor, 'your_table',('col1', 'col2'), rows)
conn.commit()