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
相关产品推荐
相关产品推荐

