【问题标题】:Python+MySQLConnector: Substitution in query results in an errorPython+MySQL 连接器:查询中的替换导致错误
【发布时间】:2014-01-14 14:24:23
【问题描述】:

我使用的是 MySQL 连接器/Python API,而不是 MySQLdb。

我需要动态地将值插入到稀疏表中,所以我编写了这样的 Python 代码:

cur.executemany("UPDATE myTABLE SET %s=%s WHERE id=%s" % data)

在哪里

data=[('Depth', '17.5cm', Decimal('3003')), ('Input_Voltage', '110 V AC', Decimal('3004'))]

但它导致了一个错误:

TypeError: not enough arguments for format string

这个问题有什么解决办法吗?有没有可能使用executemany 替换查询中的字段?

谢谢。

【问题讨论】:

  • 总是发布错误信息。

标签: python mysql mysql-connector


【解决方案1】:

让我们从原来的方法开始:

正如错误消息所示,您的 SQL 语法(不是 Python)有问题。如果您插入您的值,您实际上是在尝试执行

UPDATE myTABLE SET 'Depth'='17.5cm' WHERE id='3003'

您应该注意到您正在尝试将值分配给字符串'Depth',而不是数据库字段。原因是 mysql 模块的 %s 替换仅适用于值,而不适用于表/字段或其他对象标识符。

在第二次尝试中,您不再使用替换。相反,您使用通用的 python 字符串插值,但是看起来很相似。这对您不起作用,因为您的代码中有太多 , 和一对括号。它应该是:

cur.execute("UPDATE myTABLE SET %s=%s WHERE id=%s" % data)

我还将executemany 替换为execute,因为此方法仅适用于单行。但是您的示例只有一行,因此无论如何都不需要使用executemany

然而,第二种方法有一些缺点。对于 SQL 查询,不能保证以正确的方式引用或格式化替换,这可能会导致某些输入出现意外行为并且可能是安全问题。

我宁愿问,为什么必须首先动态提供字段名称。这应该不是必需的,并且可能会引起一些麻烦。

【讨论】:

  • 请发布完整的错误回溯。你改行data = ('Depth','17.5cm',Decimal('3003'))了吗?
  • 感谢您的快速回复。但是使用您的代码会导致一个新错误:“TypeError:格式字符串的参数不足”。我是python和mysql的新手,所以我不太确定错误消息的含义......是不是因为'data'的格式?
  • data 来自另一个表。 print(data)('Depth', '17.5"', Decimal('237603'))
  • 错误回溯怎么办?替换应该没问题,数据中有三个值,查询中有三个%s
  • 抱歉误导。错误是mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '" WHERE model_id=3003' at line 1
猜你喜欢
  • 2014-08-30
  • 1970-01-01
  • 2015-04-28
  • 1970-01-01
  • 2013-02-12
  • 2012-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多