sql错误1054,python中带有占位符的“field list”中的未知列“xx”

w6lpcovy  于 2021-06-24  发布在  Mysql
关注(0)|答案(2)|浏览(431)

我对使用python的mysql还很陌生,当我尝试使用python友好的占位符('%s')执行预先准备好的sql insert语句时,遇到了常见的1054错误
我知道通常的解决方案是添加引号来代替反引号,或者如果插入的值缺少引号就添加引号,但是我对cols和vals元组进行了检查,发现它们包含在单引号中,所以我有点困惑为什么会出现此错误。
下面是我的代码片段:(顺便说一句,‘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'")
nfg76nw0

nfg76nw01#

似乎你在问如何解决这个问题?

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

然后运行脚本。

iovurdzv

iovurdzv2#

感谢@gordon linoff和@shuo的帮助。结果证明,我的简化版sql语句是误导性的。我使用sql命令行直接手动添加列来找到答案。
结果发现,我的一些列名超过了sql所规定的64个字符的限制(这些列名是通过编程生成的),因此,循环有时有效,有时无效。不知道sql中是否有缩短列标题的方法,我在快速浏览之后看到了有关压缩方法的内容?
与此同时,我创建了一个python字典,在创建时捕获这些超长的列名,并将它们Map到手动创建的可选值,我想现在就可以了。再次感谢你给我指引方向。

相关问题