Python + MySQL Connector:查询中的替换导致错误

时间:2013-12-27 00:34:49

标签: python mysql mysql-connector

我使用的是MySQL Connector / 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

这个问题有解决办法吗?当有a时,是否可以使用executemany 替换查询中的字段?

感谢。

1 个答案:

答案 0 :(得分:0)

让我们从原始方法开始:

由于错误消息表明您的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查询,不能保证以正确的方式引用或格式化替换,这可能会导致某些输入的意外行为,并且可能是安全问题。

我宁愿问,为什么有必要首先动态提供字段名称。这不应该是必要的,可能会造成一些麻烦。