Найти - Пользователи
Полная версия: MySQL WHERE id in %s
Начало » Базы данных » MySQL WHERE id in %s
1
agryn
У меня есть масив 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))
Выдает ошибку типа синтаксическая ошибка. Как правильно сделать запрос по спику id в масиве
py.user.next
>>> """ %s """ % '(1, 2, 3)'
' (1, 2, 3) '
>>>
JOHN_16
py.user.next
не не не, вы что советуете - если такое подставит в реальный код, то SQL-инъекция будет доступна наверняка. Здесь %s это не питоновская подстановка, а MySQL - она призвана экранировать символы для предотвращения атак.

agryn
попробуйте так (или вообще без tuple - но это не уверен):
cur.execute(""" 
                DELETE 
                FROM `mbpjs_tst_jglist_companies`
                WHERE id in %s
                """, (tuple(list_id), ))
py.user.next
JOHN_16
Здесь %s это не питоновская подстановка
я не знал
sank
Вроде так надо:
list_id = [1,2,3,4,5,]
....
cur.execute(""" 
                DELETE 
                FROM `mbpjs_tst_jglist_companies`
                WHERE id in (%s)
                """, (','.join(list_id),))
Skivbard
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.
sank
Ну тогда банально без параметров сделать так:
list_id = [1,2,3,4,5,]
....
cur.execute(""" 
                DELETE 
                FROM `mbpjs_tst_jglist_companies`
                WHERE id in (%s)
                """ % ','.join(list_id))
либо циклом по одному, если list_id сожержит слишком много элементов. А то может база не скушать …
Skivbard
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))
те же яйца, только в профиль и даже хуже, потому что лепка строки, а не передача аргумента.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB