выберите из таблицы sqlite, где rowid в списке, используя python sqlite3 — DB-API 2.0

#python #sqlite

#python #sqlite

Вопрос:

Работает следующее:

 >>> cursor.execute("select * from sqlitetable where rowid in (2,3);")
  

Следующее не:

 >>> cursor.execute("select * from sqlitetable where rowid in (?) ", [[2,3]] )
sqlite3.InterfaceError: Error binding parameter 0 - probably unsupported type.
  

Есть ли способ передать список python без необходимости сначала форматировать его в строку?

Ответ №1:

К сожалению, нет. Каждому значению должен быть присвоен собственный параметр mark ( ? ). Поскольку список аргументов может (предположительно) иметь произвольную длину, вы должны использовать форматирование строк для построения правильного количества меток параметров. К счастью, это не так сложно:

 args=[2,3]
sql="select * from sqlitetable where rowid in ({seq})".format(
    seq=','.join(['?']*len(args)))

cursor.execute(sql, args)
  

Комментарии:

1. args всегда должен быть список или кортеж аргументов. Аргументами могут быть строки, но args сами по себе — никогда.

2. Поскольку этому ответу 5 лет old…is это все еще актуально? По-прежнему ли pysqlite не поддерживает IN список?

3. Полезно до сих пор в 2020 году! Спасибо @unutbu

4. Существует ли ограничение на количество значений, которые мы можем предоставить для выполнения?

5. @Srikan да, вы должны обратить внимание на SQLITE_LIMIT_VARIABLE_NUMBER ограничение ( sqlite.org/c3ref / … ), для которого по умолчанию установлено значение 999. Т.е. у вас не может быть больше 999 ? в запросе

Ответ №2:

В Python 3.6 вы также можете создавать запросы с помощью f строк:

 args=[2, 3]
query = f"SELECT * FROM sqlitetable WHERE rowid in ({','.join(['?']*len(args))})"
cursor.execute(query, args)
  

Комментарии:

1. Что, если вы хотите использовать именованные аргументы?

Ответ №3:

SQLite изначально поддерживает только типы TEXT, INTEGER, REAL, BLOB и NULL. Если вы хотите использовать другие типы, вы должны добавить поддержку для них самостоятельно. Параметр detect_types и использование пользовательских преобразователей, зарегистрированных с помощью функции register_converter () на уровне модуля, позволяют вам легко это сделать.

Как описано ранее, SQLite поддерживает только ограниченный набор типов изначально.

Чтобы использовать другие типы Python с SQLite, вы должны адаптировать их к одному из поддерживаемых типов модуля sqlite3 для SQLite: одному из NoneType, int, float, str, bytes.

https://docs.python.org/3.6/library/sqlite3.html#using-adapters-to-store-additional-python-types-in-sqlite-databases