#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.