使用Python向MySQL插入变量值触发1054错误,求解决方案
解决MySQL插入报错:Unknown column 'Jonh' in 'field list'
这个错误的根源很明确:你用字符串格式化%直接把变量拼进SQL语句时,字符串类型的变量没有被添加引号,导致数据库把Jonh、male这些值当成了列名,而不是你要插入的字符串数据。
举个例子,你拼接后的SQL语句实际是这样的:
INSERT INTO table1(username,gender,age,password,id) VALUES(Jonh,male,23,123456789,11111111)
数据库看到Jonh没有引号,就会去查找名为Jonh的列,自然找不到,所以报错。
正确的解决方案:使用参数化查询
不要用字符串拼接生成SQL,而是利用MySQLdb的参数化查询功能,让驱动自动处理引号和数据类型转换,同时还能避免SQL注入风险。修改你的代码如下:
#!/usr/bin/python # -*- coding: UTF-8 -*- import MySQLdb import sys db = MySQLdb.connect("140.120.31.124","usr1","606","testdb",port=3306 ) cursor = db.cursor() urn="Jonh" gdr="male" agex="23" psd="123456789" idx="11111111" # 只定义SQL模板,不要拼接变量 sql = """INSERT INTO table1(username,gender,age,password,id) VALUES(%s,%s,%s,%s,%s)""" try: # 将参数作为第二个参数传给execute,注意age要转成int类型(因为你的表中age是int(2)) cursor.execute(sql, (urn, gdr, int(agex), psd, idx)) db.commit() except Exception as inst: db.rollback() print(inst) db.close()
额外注意点
- 你的表中
age是int(2)类型,所以最好把字符串类型的agex显式转成int,避免数据库隐式转换可能带来的问题。 - 注释里的SQL能正常运行,是因为你手动给字符串加了双引号,而变量拼接时没有自动添加,这就是两种写法的核心区别。
内容的提问来源于stack exchange,提问作者陳俊良




