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

Спасибо, о таком не догадался. :)

ls-h ★★★★★
() автор топика
Ответ на: комментарий от 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
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.