Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.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将列表值传递给MySQL查询_Python_Mysql_Python 3.x - Fatal编程技术网

使用Python将列表值传递给MySQL查询

使用Python将列表值传递给MySQL查询,python,mysql,python-3.x,Python,Mysql,Python 3.x,我想传递列表值和其他参数值。下面是我的场景。我想为“Code”列传递多个值,并想将单个值传递给“Code”列 在Python中执行时,我遇到以下错误 查询执行失败:格式参数处理失败;python “tuple”无法转换为MySQL类型 这里的技巧是WHERE IN子句,它实际上不适合参数化。一个选项在子句中生成一个,其中包含列表中占位符的确切数量: codes = ('AFG', 'IND') continent = 'Asia' params = codes + (continent,) wh

我想传递列表值和其他参数值。下面是我的场景。我想为“Code”列传递多个值,并想将单个值传递给“Code”列

在Python中执行时,我遇到以下错误

查询执行失败:格式参数处理失败;python “tuple”无法转换为MySQL类型


这里的技巧是
WHERE IN
子句,它实际上不适合参数化。一个选项在子句中生成一个
,其中包含列表中占位符的确切数量:

codes = ('AFG', 'IND')
continent = 'Asia'
params = codes + (continent,)
where_in = ','.join(['%s'] * len(codes))
sql = "SELECT * FROM country WHERE Code IN (%s) AND Continent = %s" % (where_in, '%s')
cursor.execute(sql, params)
要了解上面的脚本实际做了什么,让我们看看各个部分:

print(where_in)
print(sql)

%s,%s
SELECT * FROM country WHERE Code IN (%s,%s) AND Continent = %s
这里的技巧是,我们实际上使用了两次
%s
占位符,一次用于Python字符串,第二次用于SQL查询字符串。此外,我们还绑定了一个包含所有绑定值的单层元组:

('AFG', 'IND', 'ASIA')

首先拆分列表,然后拆分元组

param = [('AFG', 'IND'),'Asia']
p1,p2=param[0]
query = "select * from country where Code in ('%s','%s') AND Continent = %s" % (p1,p2,param[1])
cursor.execute(query)

@MaxMuster我想你是想把这条评论放在OP下面。假设OP的查询是正确的,我已经给出了正确的答案。对不起,我现在看到他的查询也有了。谢谢@TimBiegeleisen,我有一个问题。如果有多个列具有列表值,如何传递它们?我的意思是,如果我想将代码和大陆作为列表值传递,那么如何传递它们。然后根据答案,您需要两个where_in变量,每个where in子句对应一个,您必须替换并绑定这两个变量。我不会更新我的答案,但如果您仍然有疑问,请随意打开一个新问题。奇怪的是,我将您的代码放入mariadb中,它给出了一个完全不同的错误:(1241,'操作数应包含1列)'这是不正确的,
%s
占位符不应包含在单引号中(这部分违背了使用语句的目的)。此外,您正在硬编码
WHERE IN
加上两项,而事实上,这个问题的未来读者可能需要一个任意数字的解决方案。
param = [('AFG', 'IND'),'Asia']
p1,p2=param[0]
query = "select * from country where Code in ('%s','%s') AND Continent = %s" % (p1,p2,param[1])
cursor.execute(query)