Python 3.x PythonSQLite3:通过多个键和键值列表从表中选择,如果可能,使用参数化
如果我使用单键查询SqLite表,我可以使用以下代码进行参数化:Python 3.x PythonSQLite3:通过多个键和键值列表从表中选择,如果可能,使用参数化,python-3.x,sqlite,Python 3.x,Sqlite,如果我使用单键查询SqLite表,我可以使用以下代码进行参数化: contact_phones_list = ['+123456789', '+987654321'] q = "select * from {} WHERE user_phone in ({})".format( my_table_name, ', '.join('?' for _ in contact_phones_list)
contact_phones_list = ['+123456789', '+987654321']
q = "select * from {} WHERE user_phone in ({})".format(
my_table_name,
', '.join('?' for _ in contact_phones_list)
)
res = self.cursor.execute(q, contact_phones_list).fetchall()
现在我想查询具有值的密钥对:
keys = ['user_phone', 'contact_phone']
values = [('+1234567', '+1000000'), ('+987654321', '+1200000')]
q = "select contact_phone, is_main, aliases from {} WHERE ({}) in ({})".format(
my_table_name,
', '.join(keys),
', '.join('(?, ?)' for _ in values)
)
res = self.cursor.execute(q, values).fetchall()
我得到错误“行值被误用”。我尝试了许多子列表而不是元组的组合,单“?”等等
在这种情况下,如何创建参数化
编辑:添加“值”关键字并展平列表:
keys = ['user_phone', 'contact_phone']
values = [('+1234567', '+1000000'), ('+987654321', '+1200000')]
values_q = []
for v in values:
values_q += [v[0], v[1]]
q = "select * from my_table_name WHERE ({}) IN (VALUES {})".format(
', '.join(keys),
', '.join('(?, ?)' for _ in values)
)
res = cursor.execute(q, values_q).fetchall()
这是一个解决方案还是唯一可接受的解决方案?来自:
对于运算符中的行值,左侧(以下简称“LHS”)可以是带括号的值列表,也可以是具有多列的子查询。但右侧(以下简称“RHS”)必须是子查询表达式
您正在构建的东西看起来像((?,?)中的((?,?),(?,?),但不符合该要求。不过,(VALUES(?,,(?,?)中的语法(?,?)是有效的
此外,我认为您可能需要将传递给准备语句的元组列表展平,但对python更了解的人必须肯定地说。实际上,以下解决方法似乎有效:select*from my_table,where(user_phone,contact_phone)in(VALUES(?),(?,?)
。为了填充占位符,我创建了一个列表,在这个列表中我只是连接了一些值,比如values\u q=['+1234567'、'+1000000'、'+987654321'、'+1200000']
我只是不知道库正在填充SQL语句的哪些部分