Подтвердить что ты не робот

Как использовать python mysqldb для вставки сразу нескольких строк

У меня есть список списков, например [['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]))
4b9b3361

Ответ 1

Из Руководство пользователя MySQLdb:

c.executemany(
      """INSERT INTO breakfast (name, spam, eggs, sausage, price)
      VALUES (%s, %s, %s, %s, %s)""",
      [
      ("Spam and Sausage Lover 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')])

Ответ 2

Можно вставить все строки в один оператор, например, @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 строк в локальный DB, executemany был на 20% медленнее).