SQL错误1054,“带有占位符的Python中的'字段列表'中的未知列'xxxxx'”

时间:2016-10-05 11:43:41

标签: python mysql sql mariadb pymysql

我是使用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'")

2 个答案:

答案 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字典,用于在创建时捕获这些超长的列名,并将它们映射到手动创建的替代值,现在我想这样做。再次感谢您给我指导。