Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 19, 2012 23:01:30

agryn
От: Украина
Зарегистрирован: 2011-12-14
Сообщения: 189
Репутация: +  0  -
Профиль   Отправить e-mail  

MySQL WHERE id in %s

У меня есть масив 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 в масиве

Отредактировано agryn (Дек. 19, 2012 23:02:32)

Офлайн

#2 Дек. 20, 2012 04:02:32

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9867
Репутация: +  853  -
Профиль   Отправить e-mail  

MySQL WHERE id in %s

>>> """ %s """ % '(1, 2, 3)'
' (1, 2, 3) '
>>>



Офлайн

#3 Дек. 20, 2012 04:09:08

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

MySQL WHERE id in %s

py.user.next
не не не, вы что советуете - если такое подставит в реальный код, то SQL-инъекция будет доступна наверняка. Здесь %s это не питоновская подстановка, а MySQL - она призвана экранировать символы для предотвращения атак.

agryn
попробуйте так (или вообще без tuple - но это не уверен):

cur.execute(""" 
                DELETE 
                FROM `mbpjs_tst_jglist_companies`
                WHERE id in %s
                """, (tuple(list_id), ))



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Отредактировано JOHN_16 (Дек. 20, 2012 04:11:15)

Офлайн

#4 Дек. 20, 2012 08:05:22

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9867
Репутация: +  853  -
Профиль   Отправить e-mail  

MySQL WHERE id in %s

JOHN_16
Здесь %s это не питоновская подстановка
я не знал



Офлайн

#5 Дек. 20, 2012 09:00:26

sank
Зарегистрирован: 2012-10-05
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

MySQL WHERE id in %s

Вроде так надо:

list_id = [1,2,3,4,5,]
....
cur.execute(""" 
                DELETE 
                FROM `mbpjs_tst_jglist_companies`
                WHERE id in (%s)
                """, (','.join(list_id),))

Офлайн

#6 Янв. 11, 2013 12:10:34

Skivbard
Зарегистрирован: 2013-01-11
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

MySQL WHERE id in %s

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.

Офлайн

#7 Янв. 11, 2013 12:22:32

sank
Зарегистрирован: 2012-10-05
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

MySQL WHERE id in %s

Ну тогда банально без параметров сделать так:

list_id = [1,2,3,4,5,]
....
cur.execute(""" 
                DELETE 
                FROM `mbpjs_tst_jglist_companies`
                WHERE id in (%s)
                """ % ','.join(list_id))
либо циклом по одному, если list_id сожержит слишком много элементов. А то может база не скушать …

Офлайн

#8 Янв. 11, 2013 12:38:28

Skivbard
Зарегистрирован: 2013-01-11
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

MySQL WHERE id in %s

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))
те же яйца, только в профиль и даже хуже, потому что лепка строки, а не передача аргумента.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version