如何使用字符串实例执行SQL插入操作?遇到pymysql 1054未知列错误如何解决?
pymysql执行SQL插入报1054错误解决方案
你遇到的pymysql.err.OperationalError: (1054, "Unknown column 'ZBZ' in 'field list'")错误,核心原因是手动拼接SQL时没有给字符串类型的插入值加单引号,MySQL将传入的字符串内容识别为字段名,找不到对应字段就抛出该错误。
比如你拼接得到的非法SQL结构如下:INSERT INTO 你的表名 (Id, score) VALUES (ZBZ, 90)
MySQL会将没有引号包裹的ZBZ判定为字段名,而非你要插入的Id字段值。
解决方案
临时修复方案(不推荐,存在SQL注入风险)
手动给字符串类型的插入值包裹英文单引号,修正后SQL结构如下:INSERT INTO 你的表名 (Id, score) VALUES ('ZBZ', 90)
该方案仅能临时解决报错,若插入值包含单引号等特殊字符还会触发新的语法错误,同时无法防范SQL注入攻击。最优解决方案(推荐)
不要手动拼接SQL字符串,直接使用pymysql自带的参数化查询能力,示例代码如下:
import pymysql # 数据库连接配置替换为你自己的信息 conn = pymysql.connect( host="127.0.0.1", user="你的数据库用户名", password="你的数据库密码", database="你的数据库名" ) cursor = conn.cursor() # 1. 先将你的name数组转成字符串,比如[65,65,65]转成'AAA' id_value = ''.join([chr(i) for i in name]) score_value = 你的分数变量 # 2. 用%s做占位符,参数放在execute的第二个参数元组中 sql = "INSERT INTO 你的表名 (Id, score) VALUES (%s, %s)" cursor.execute(sql, (id_value, score_value)) conn.commit() # 关闭连接 cursor.close() conn.close()
参数化查询会自动处理不同数据类型的格式适配,字符串类型的值会自动加引号,既不会出现当前的语法错误,还能完全规避SQL注入风险,同时不需要你手动处理特殊字符转义。
额外注意:你的Id字段类型为varchar(3),需保证转换得到的字符串长度不超过3,否则会触发数据长度超限的报错,你当前使用的[65,65,65]转换后长度为3,符合字段要求。
内容的提问来源于stack exchange,提问作者user15716685
相关产品推荐
相关产品推荐

