我使用的是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
替换查询中的字段?
感谢。
答案 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查询,不能保证以正确的方式引用或格式化替换,这可能会导致某些输入的意外行为,并且可能是安全问题。
我宁愿问,为什么有必要首先动态提供字段名称。这不应该是必要的,可能会造成一些麻烦。