LINUX.ORG.RU

[python][mysql] SQL WHERE IN


0

0

Надо сформировать запрос с использованием IN в WHERE.
«„„SELECT * FROM table WHERE table.a IN %s AND table.b=%s““»,(self.a,self.b))
self.b - просто число и проблем с ним нет.
self.a - питоновская строка = '(1,2,3,4,5)', она формируется в цикле из элементов массива.

MySQL на это ругается:
_mysql_exceptions.ProgrammingError: (1064, «You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax.

Что можно сделать?

★★★★

Ну, например, вывести готовый запрос в stdout и посмотреть, что с ним не так.

vaulter ()

«„„SELECT * FROM table WHERE table.a IN %s AND table.b=%s““» % (self.a,self.b), Ты же строку форматируешь нет? или тупл как параметр в неизвестный нам метод передаешь?

zJes ★★ ()

Немного сократил.
Там cur.execute («„„SELECT * FROM table WHERE table.a IN %s AND table.b=%s““»,(self.a,self.b))

cur - курсор из MySQLdb.

Прошу прощения, что непонятно написал.

ls-h ★★★★ ()
Ответ на: комментарий от ls-h

Другие запросы работают. Тут проблема как передать параметр для IN.
Похоже он передается как-то так:
'(1,2,3,4)'
Вместо просто:
(1,2,3,4)

Поэтому косяк.

Может быть можно как-то передать массив, чтобы execute() его сам распарсил в последовательность в кавычках?

ls-h ★★★★ ()
Ответ на: комментарий от ls-h

Тогда единственное это смотреть на запрос который отправляется на сервер. :) Действительно ли а = "(1,2,3)"

zJes ★★ ()
Ответ на: комментарий от zJes

Спасибо!
А как получить уже сформированный запрос, такой, который курсором отправляется сервером?

ls-h ★★★★ ()
Ответ на: комментарий от zJes

Только я не проверял, будет ли такое работать, бредово конечно. :)

А вообще напрямую работать с бд, не лучше использовать sqlalchemy или elixir? Уровень абстракции выше...

table.filter(table.a.in_(a)).all()

zJes ★★ ()
Ответ на: комментарий от zJes

Кажись работает, завтра еще посмотрю, спать охото.

А вообще напрямую работать с бд, не лучше использовать sqlalchemy или elixir? Уровень абстракции выше...

Может и лучше, но я уже много накодил, в другой раз на них посмотрю...

ls-h ★★★★ ()

если это WEB... здравствуй SQL-инъекция!

Народ, НИКОГДА, повторяю, НИКОГДА не делайте составление SQL-запроса в строке. Используйте биндование! Возьмите это за правило.

Deleted ()
Ответ на: комментарий от Deleted

> Народ, НИКОГДА, повторяю, НИКОГДА не делайте составление SQL-запроса в строке

что за бред. Что, даже число нельзя подставлять таким образом? Или тупл из чисел? прям уж сразу инъекция

unC0Rr ★★★★★ ()
Ответ на: комментарий от ls-h

self.a = '1,2,3,4,5'

cur.execute ("""SELECT * FROM table WHERE table.a IN (%s) AND table.b=%s""",(self.a[1:-1],self.b))

self.a = '(1,2,3,4,5)'

cur.execute ("""SELECT * FROM table WHERE table.a IN (%s) AND table.b=%s""",(self.a[2:-2],self.b))

shrub ★★★★★ ()
Ответ на: комментарий от shrub

что-то я не выспался :( правильно вот так:

self.a = '(1,2,3,4,5)'

cur.execute ("""SELECT * FROM table WHERE table.a IN (%s) AND table.b=%s""",(self.a[1:-1],self.b))

shrub ★★★★★ ()
Ответ на: комментарий от unC0Rr

>что за бред.

это не бред, а реалии.

Deleted ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.