Как использовать python mysqldb для вставки сразу нескольких строк
у меня есть список списков, e.g [['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]))
2 ответов
С пользователь 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, и одновременно избежать SQL-инъекций, таких как @zenpoy. Вам просто нужно создать большой оператор 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 строк в локальную БД, executemany был на 20% медленнее).