Python 正确的方法;选择*from tbl where field in?";占位符是一个没有字符串插值的列表

Python 正确的方法;选择*from tbl where field in?";占位符是一个没有字符串插值的列表,python,pysqlite,Python,Pysqlite,我使用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");

我使用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中使用占位符参数和列表

更新 与此不同的是,他们似乎希望使用%s字符串插值,而我希望避免这种情况

问题
字段在哪里?
占位符是一个没有字符串插值的列表

  • 值是
    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)
    

字段=(“Aa”,“Bb”)
======================
结果集=c.execute('select*from tbl,其中字段1位于(%s)%(“?,”*len(字段))[:-1],字段)
谢谢,我在问如何使用占位符安全地执行此操作?语法,而不是字符串插值。使用
时,这已经考虑了sql注入,但我仍然在寻找它。这似乎是重复的,我假设
变量的长度是未知的,可能会变化?