【问题标题】:Pass list values to MySQL query using Python使用 Python 将列表值传递给 MySQL 查询
【发布时间】:2019-12-11 20:59:35
【问题描述】:

我想将列表值与其他参数值一起传递。以下是我的场景。我想为“代码”列传递多个值,并且想将单个值传递给“大陆”列。

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

在 Python 中执行时,出现以下错误。

执行查询失败:处理格式参数失败; Python 'tuple' 不能转换为 MySQL 类型

【问题讨论】:

  • 很奇怪,我把你的代码放在 mariadb 中,它给出了一个完全不同的错误:(1241,'操作数应该包含 1 列')

标签: python mysql python-3.x


【解决方案1】:

这里的诀窍是WHERE IN 子句,它并不适合被参数化。一个选项会生成一个 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')

【讨论】:

  • @MaxMuster 我认为您的意思是在 OP 下删除此评论。假设 OP 的查询是正确的,我已经给出了正确的答案。
  • 抱歉,我现在看到他的查询也有。
  • 谢谢@TimBiegeleisen,我有一个问题。如果我有不止一列有列表值,如何传递它们?我的意思是如果我想将 Code 和 Continent 作为列表值传递,如何传递它们。
  • 然后通过答案,您将需要两个 where_in 变量,每个 WHERE IN 子句一个,您必须替换并绑定它们。我不会更新我的答案,但如果您仍有疑问,请随时提出新问题。
【解决方案2】:

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

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)

【讨论】:

  • 这是不正确的,%s 占位符应该用单引号括起来(这部分违背了使用语句的目的)。此外,您正在硬编码WHERE IN 加上两个项目,而事实上这个问题的未来读者可能想要一个任意数字的解决方案。
猜你喜欢
  • 1970-01-01
  • 2021-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多