Правильный способ "выбрать * из таблицы, где поле?" и заполнитель является списком без интерполяции строк

У меня есть запрос этой формы, используя pysqlite:

query = "select * from tbl where field1 in ?"
variables = ['Aa', 'Bb']

В запросе я хотел бы, чтобы это работало:

with conn.cursor() as db:
  res = db.execute(query, (variables,)).fetchall()

например, интерпретируется в командной строке SQLITE как:

select * from tbl where field1 in ("Aa", "Bb");

Но это не так с:

pysqlite3.dbapi2.InterfaceError: Error binding parameter 0 - probably unsupported type.

Я понимаю, что могу просто string.join([mylist]), но это небезопасно. Как я могу использовать параметры заполнителя и список в SQLite с Python?

Обновить

В отличие от аналогичных вопросов по Stackru, они, похоже, стремятся использовать%s строковую интерполяцию, где я пытаюсь избежать этого

1 ответ

Вопрос: WHERE field IN ? и заполнитель является списком без интерполяции строк

  • Значения представляют собой список int

    values = (42, 43, 44)
    
  • Подготовьте ваш запрос с количеством привязок

    bindings = '?,'*len(values)
    QUERY = "SELECT * FROM t1 WHERE id IN ({});".format(bindings[:-1])
    
    print("{}".format(QUERY))
    

    Выход:

    SELECT * FROM t1 WHERE id IN (?,?,?);
    
  • Выполнить запрос

    cur.execute (QUERY, values)
    
Другие вопросы по тегам