Подстановка строки Python в SQL-запрос - PullRequest
2 голосов
/ 05 марта 2011

Я пытаюсь использовать оператор IN для возврата результатов, которые соответствуют одной из списка строк

, например

strings = ['string1', 'string2', 'string3'] c.execute('select count(*) from table where foo in ?', strings)

iзнаю, что это неправильно и не работает, но я надеюсь, что это подчеркивает то, что я пытаюсь сделать ...

Ответы [ 2 ]

6 голосов
/ 05 марта 2011

Вы не можете этого сделать.Есть три проблемы:

  • Вы не можете иметь таблицу с именем table, если не используете обратные метки вокруг имени таблицы.
  • Предложение IN должно содержать круглые скобки.
  • Требуется три параметра, а не один.

Попробуйте вместо этого:

sql = 'SELECT COUNT(*) FROM yourtable WHERE foo IN (?, ?, ?)'

Если число строк является переменным, используйте его вместо:

params = ','.join('?' for x in strings)
sql = 'SELECT COUNT(*) FROM yourtable WHERE foo IN (' + params + ')'
2 голосов
/ 05 марта 2011

Вы можете сделать ','.join(strings), как предполагает @Mark Byers, это работает в большинстве случаев. Однако, если число строк очень длинное , оно не будет выполнено, поскольку запросы SQL имеют ограниченную длину.

Другой способ сделать это - создать временную таблицу, вставить туда все строки и выполнить соединение для выполнения пересечения, что-то вроде

c.execute('CREATE TEMP TABLE strings (s STRING)')
c.executemany('INSERT INTO strings (s) VALUES (?)', ((s,) for s in strings))
c.execute('SELECT COUNT(*) FROM table JOIN strings ON table.foo == strings.s')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...