Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x PythonSQLite3:通过多个键和键值列表从表中选择,如果可能,使用参数化_Python 3.x_Sqlite - Fatal编程技术网

Python 3.x PythonSQLite3:通过多个键和键值列表从表中选择,如果可能,使用参数化

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)

如果我使用单键查询SqLite表,我可以使用以下代码进行参数化:

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语句的哪些部分