Форум сайта python.su
У меня есть масив id list_id = по которым нужно удалить данные в таблице
при запуске такого кода:
list_id = [1,2,3,4,5,] .... cur.execute(""" DELETE FROM `mbpjs_tst_jglist_companies` WHERE id in %s """, tuple(list_id))
Отредактировано agryn (Дек. 19, 2012 23:02:32)
Офлайн
>>> """ %s """ % '(1, 2, 3)' ' (1, 2, 3) ' >>>
Офлайн
py.user.next
не не не, вы что советуете - если такое подставит в реальный код, то SQL-инъекция будет доступна наверняка. Здесь %s это не питоновская подстановка, а MySQL - она призвана экранировать символы для предотвращения атак.
agryn
попробуйте так (или вообще без tuple - но это не уверен):
cur.execute(""" DELETE FROM `mbpjs_tst_jglist_companies` WHERE id in %s """, (tuple(list_id), ))
Отредактировано JOHN_16 (Дек. 20, 2012 04:11:15)
Офлайн
JOHN_16я не знал
Здесь %s это не питоновская подстановка
Офлайн
Вроде так надо:
list_id = [1,2,3,4,5,] .... cur.execute(""" DELETE FROM `mbpjs_tst_jglist_companies` WHERE id in (%s) """, (','.join(list_id),))
Офлайн
sank
Не-не-не, это плохой паттерн, как и лепка строки выше
JOHN_16 прав.
Не знаю как в мускуле, но вот, что говорится в документации по постгресу на этот счет:
http://initd.org/psycopg/docs/usage.html
Warning Never, never, NEVER use Python string concatenation (+) or string parameters interpolation (%) to pass variables to a SQL query string. Not even at gunpoint.
Офлайн
Ну тогда банально без параметров сделать так:
list_id = [1,2,3,4,5,] .... cur.execute(""" DELETE FROM `mbpjs_tst_jglist_companies` WHERE id in (%s) """ % ','.join(list_id))
Офлайн
list_id = list(range(1000)) cur.execute(""" DELETE FROM `mbpjs_tst_jglist_companies` WHERE id in %s """, (tuple(list_id), ))
list_id = [1,2,3,4,5,] .... cur.execute(""" DELETE FROM `mbpjs_tst_jglist_companies` WHERE id in (%s) """ % ','.join(list_id))
Офлайн