You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

使用Python向MySQL插入变量值触发1054错误,求解决方案

解决MySQL插入报错:Unknown column 'Jonh' in 'field list'

这个错误的根源很明确:你用字符串格式化%直接把变量拼进SQL语句时,字符串类型的变量没有被添加引号,导致数据库把Jonhmale这些值当成了列名,而不是你要插入的字符串数据。

举个例子,你拼接后的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()

额外注意点

  • 你的表中ageint(2)类型,所以最好把字符串类型的agex显式转成int,避免数据库隐式转换可能带来的问题。
  • 注释里的SQL能正常运行,是因为你手动给字符串加了双引号,而变量拼接时没有自动添加,这就是两种写法的核心区别。

内容的提问来源于stack exchange,提问作者陳俊良

火山引擎 最新活动