MySQL OperationalError(1054)报错求助:字段列表不存在'l'列
解决MySQLdb插入数据时的OperationalError (1054)问题
咱们先拆解下你遇到的错误:_mysql_exceptions.OperationalError: (1054, "Unknown column 'l' in 'field list'"),这个报错的核心原因是字符串格式化拼接SQL时,没有给字符串值加上正确的引号,导致数据库把你要插入的字符(比如l)当成了列名,而你的cmdb_hostgroup表根本没有这个列,所以触发了错误。
举个例子,当循环到i='l'时,你的代码生成的SQL语句是这样的:
INSERT INTO cmdb_hostgroup(name, created_at, updated_at) VALUES (l, "2018-01-31 07:50:26.879000", "2018-01-31 07:50:26.879000");
数据库看到l没有被引号包裹,就会默认它是一个列名,自然找不到就报错了。
正确的解决方式:使用参数化查询
MySQLdb原生支持参数化查询,这种写法既能避免这类语法错误,还能防止SQL注入,是更规范安全的做法。数据库驱动会自动帮你处理数据类型和引号的问题,不需要手动拼接。
修改后的代码如下:
import MySQLdb db = MySQLdb.connect("127.0.0.1", "root", "liao", "adminset") cursor = db.cursor() # 定义带占位符的SQL模板,%s是参数占位符 sql = """INSERT INTO cmdb_hostgroup(name, created_at, updated_at) VALUES (%s, %s, %s);""" time_str = "2018-01-31 07:50:26.879000" for i in "liaogx": # 将参数以元组形式传给execute方法 cursor.execute(sql, (i, time_str, time_str)) # 必须提交事务!之前的代码缺失这一步,即使没报错数据也不会写入数据库 db.commit() db.close()
几个关键修改点:
- 把SQL改成带
%s占位符的模板,不再用字符串格式化直接拼接变量 - 把要插入的参数打包成元组,作为
execute的第二个参数传入 - 添加
db.commit():MySQL默认是手动提交事务的,不执行这一步所有插入操作都不会真正落地
这样修改后,每个字符都会被正确识别为字符串值,不会再被误判为列名,1054的错误也就解决了。
内容的提问来源于stack exchange,提问作者Crypto营长
相关产品推荐
相关产品推荐

