我是使用Python的mySQL新手,当我尝试使用Python友好占位符('%s')执行预先准备好的SQL INSERT语句时,我遇到了常见的1054错误
我理解正常的解决方案是添加引号代替后退,或者如果它们缺少插入的值,则添加它们,但是我已经检查了cols和vals元组,我可以看到它们'重新包含在单引号内,所以我有点疑惑为什么会出现这个错误。
下面是我的代码片段:(BTW'cols'和'vals'是字符串的元组(重点是字符串:))
首先我添加列名:
for item in cols:
try:
# First add columns if not already present
query = "ALTER TABLE Parameters ADD COLUMN %s VARCHAR(200)" % (str(item))
cursor.execute(query)
connection.commit()
except:
pass
然后我尝试添加值:
sql = "INSERT INTO Parameters ({0}) VALUES ({1})".format(', '.join(cols), ', '.join(['%s'] * len(cols)));
try:
cursor.execute(sql, vals)
except Exception as e:
print(e)
connection.close()
有时没有问题,但否则我会收到此错误:
(1054, "Unknown column 'ColumnName' in 'field list'")
我的Python语句完全不正确,占位符不是最佳做法吗?我使用占位符,因为我的列表非常大。
这是SQL语句打印的一个愚蠢版本。
INSERT INTO Parameters (TestID, Dev_Type, Version, MAC, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, DayActNxtDateTime, XXXX) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
错误:
(1054, "Unknown column 'DayActNxtDateTime' in 'field list'")
答案 0 :(得分:0)
好像你在问这个问题怎么回事?
INSERT INTO Parameters ({0}) VALUES ({1})
错误报告在您的({0})中,您有一个名为“ColumnName”的字段,但未在表参数中定义。
尝试:
SHOW CREATE TABLE parameters;
并确保您的表格包含该字段。
如果仍有问题,请打印出异常处理程序中的所有sql:
print(e)
print(sql)
然后我将运行tcpdump以确保sql字符串没有被任何库错误地修改
sudo tcpdump -A -i lo0 dst port 3306
然后运行你的脚本。
答案 1 :(得分:0)
感谢@Gordon Linoff和@Shuo的所有帮助。事实证明,我的Dumbed版本的SQL语句具有误导性。我使用SQL命令行直接手动添加列来查找答案。
事实证明我的一些列名超过了SQL强加的64个字符限制(这些列名是以编程方式生成的),因此循环有时会起作用,有时则不起作用。不确定SQL中是否有一种缩短列标题的方法,我快速浏览一下后看到了一些关于COMPRESS方法的内容?
与此同时,我创建了一个Python字典,用于在创建时捕获这些超长的列名,并将它们映射到手动创建的替代值,现在我想这样做。再次感谢您给我指导。