You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python调用PyMySQL插入users表报错,求问题原因及解决方法

问题原因分析与解决方案

让我来帮你拆解这两个错误的核心原因,以及如何正确实现用户数据的插入操作:

第一个错误:pymysql.err.InternalError: (1054, "Unknown column 'Mike' in 'field list'")

你直接在SQL语句里写Mike和password2时,MySQL会把这些没有被单引号包裹的内容识别成列名,而不是你想要插入的字符串值。你的users表中并没有名为Mike的列,因此数据库抛出了这个错误。

第二个错误:NameError: name 'Mike' is not defined

当你尝试用%s占位符时,如果直接写成execute(sql, (2, Mike, password2)),Python会把Mike和password2当成变量解析,但你并没有定义这两个变量,所以触发了NameError。


正确的实现方式(推荐参数化查询,避免SQL注入)

参数化查询是操作数据库的最佳实践,既解决语法问题,又能有效防止SQL注入攻击。你需要把字符串值作为参数传入execute()方法,无需在SQL语句里手动加引号:

import pymysql 
# 连接数据库
conn = pymysql.connect(host='hosting', user='user', password='databasepassword', db='databasename') 
# 创建游标对象
cursor = conn.cursor() 
# 带占位符的SQL语句
sql = 'INSERT INTO users(id, user, pwd) VALUES (%s, %s, %s)' 
# 执行SQL,传入参数(字符串值直接以字符串形式传入即可)
cursor.execute(sql, (2, 'Mike', 'password2'))
# 提交事务(必须执行这一步,否则数据不会写入数据库)
conn.commit()
# 关闭游标和连接
cursor.close()
conn.close()

不推荐的方式:直接在SQL中加单引号(存在SQL注入风险)

如果你一定要直接在SQL语句中写死值,需要给字符串类型的字段值加上单引号:

# 用转义单引号包裹字符串值
sql = 'INSERT INTO users(id, user, pwd) VALUES (2, \'Mike\', \'password2\')'
# 或者用双引号包裹整个SQL语句,内部用单引号
sql = "INSERT INTO users(id, user, pwd) VALUES (2, 'Mike', 'password2')"
cursor.execute(sql)
conn.commit()

额外提醒:执行插入、更新、删除这类写操作后,一定要调用conn.commit()提交事务,否则数据不会被持久化到数据库中。

内容的提问来源于stack exchange,提问作者Mitchell Lawrence

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:57:02