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

У меня есть запрос этой формы с использованием 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?

Обновлять

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


person Mittenchops    schedule 31.12.2018    source источник
comment
Спасибо, я спрашиваю, как это безопасно сделать с помощью заполнителя? синтаксис, а не с интерполяцией строк.   -  person Mittenchops    schedule 31.12.2018
comment
Это уже касается внедрения sql, когда вы используете ?, но все же я слишком ищу это. читая тоже самое.   -  person Anup Yadav    schedule 31.12.2018
comment
@BryanOakley, я считаю, что пользователь искал что-то другое, потому что в принятом ответе используется интерполяция строк.   -  person Mittenchops    schedule 31.12.2018
comment
Я предполагаю, что длина variables неизвестна и может отличаться?   -  person Anoop R Desai    schedule 31.12.2018


Ответы (1)


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

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

    values = (42, 43, 44)
    
  • # P3 #
    bindings = '?,'*len(values)
    QUERY = "SELECT * FROM t1 WHERE id IN ({});".format(bindings[:-1])
    
    print("{}".format(QUERY))
    
    # P4 #
    SELECT * FROM t1 WHERE id IN (?,?,?);
    
  • Выполнить запрос

    cur.execute (QUERY, values)
    
person stovfl    schedule 31.12.2018