Удалить несколько строк в MYSQL с информацией из списка python

Если список LL:

LL = ['foo', bar', 'noo', 'boo',]

находится в таблице MySQL, проверьте идентификатор столбца с другими идентификаторами.

Я мог бы использовать следующее, чтобы удалить все строки с идентификаторами в LL:

 csr.execute("""DELETE FROM test.test WHERE ID = "Foo"; """)
  csr.execute("""DELETE FROM test.test WHERE ID = "bar"; """)  
  csr.execute("""DELETE FROM test.test WHERE ID = "noo"; """)
  csr.execute("""DELETE FROM test.test WHERE ID = "boo"; """)  

Как я мог сделать это программно?


person Merlin    schedule 10.05.2011    source источник


Ответы (5)


Вы можете сделать это с помощью одного запроса:

id_list = ['abc', 'def', 'ghi']
query_string = "delete from test where id in (%s)" % ','.join(['?'] * len(id_list))
cursor.execute(query_string, id_list)

Поскольку cursor.execute экранирует строки при выполнении подстановок, этот пример защищен от SQL-инъекций.

person sapht    schedule 10.05.2011
comment
Нет, посмотрите, как строка запроса в ответе говорит, где id в ... не где id = ... - person Jean-Paul Calderone; 11.05.2011
comment
@ user428862 in ('abc', 'hjk', ...) работает в MySQL. Это предпочтительнее, чем id='abc' или id='hjk'. Однако мой пример содержал синтаксическую ошибку и числовые идентификаторы. Попробуйте обновленную версию. - person sapht; 11.05.2011
comment
id_list = ['acb','def', ] SQL содержит 0 маркеров параметров, но было предоставлено 2 параметра. - person Merlin; 11.05.2011
comment
Вам нужно создать переменную query_string, как указано. Он заменяет каждый идентификатор на %s. - person sapht; 11.05.2011
comment
печать query_str удалить из теста, где идентификатор в (%s,%s) - person Merlin; 11.05.2011
comment
Это выглядит хорошо. Затем используйте cursor.execute(query_str, id_list) - person sapht; 11.05.2011
comment
Есть ли способ проверить строку «query_str, id_list», я проверил ручной ввод. это должно работать, если я смогу избежать необходимости в тексте в mysql. ТИА - person Merlin; 11.05.2011
comment
cursor.execute(string, list) выполняет раскрытие переменных для значений в строке на основе их типов. Вам не нужно экранировать кавычки, просто введите %s в строку запроса, и она будет заменена значениями, взятыми по порядку из списка. Я считаю, что мой пример должен работать. Значение из (query_string % id_list) не будет равно запросу, созданному cursor.execute. - person sapht; 11.05.2011
comment
Ой! Извините, я думаю, это размытие языка. Я починил это. - person sapht; 11.05.2011

Средства форматирования строк — http://docs.python.org/library/string.html#format-string-syntax

["""DELETE FROM test.test WHERE ID = "%s"; """ % x for x in LL]

а затем запустите каждый из операторов SQL в списке.

person dfb    schedule 10.05.2011
comment
Крайне важно, чтобы LL содержал только доверенные элементы. Если он содержит данные из ненадежных источников и не экранирован должным образом, возможна SQL-инъекция. - person Rainer Rillke; 23.07.2017

for item in LL:
    csr.execute("DELETE FROM test.test WHERE ID = '%s'", item)

как это?

person tMC    schedule 10.05.2011
comment
опечатка- each должно быть item. исправлено. - person tMC; 11.05.2011

Для MySQL вам нужно использовать %s вместо ? в качестве маркера параметра. И не забудьте зафиксировать.

product_list = [645, 64, 9785, 587]
query = "DELETE FROM products WHERE id IN (%s)" % ",".join(["%s"] * len(product_list))
cursor.execute(query, product_list)
connection.commit()
person Biswajit Chopdar    schedule 23.01.2021

Мы можем использовать один запрос на удаление и преобразовать список в кортеж.

list_ids = ['foo', bar', 'noo', 'boo',]
delete_query = "DELETE FROM test.test WHERE ID=%s"
delete_records = tuple(list_ids)
cursor.executemany(delete_exec, delete_records)
person Chandan392    schedule 08.07.2020