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

Python中%s格式化的正确使用问题(pymysql插入语句报错)

解决pymysql插入语句执行错误的问题

我来帮你排查这个问题,你插入语句那行的语法有两个关键错误,咱们一步步来修正:

错误原因分析

  1. execute方法参数传递错误:你把插入的参数(name, age)写在了execute()方法的括号外面,这会导致参数根本没被传递给SQL语句,而且语法本身就不合法。
  2. 字符串格式化拼接SQL的风险:直接用%格式化拼接SQL不仅容易出现语法错误,还会带来严重的SQL注入风险,pymysql本身支持更安全的参数化查询方式。

修正后的完整代码

import pymysql

# 用关键字参数建立连接,可读性更强
conn = pymysql.connect(
    host='localhost',
    user='root',
    password='12345',
    database='cba'
)
myCursor = conn.cursor()

tn = input("Enter table name : ")
# 创建表(表名无法用参数化,需确保输入安全)
myCursor.execute(f"CREATE TABLE {tn} (rollno int primary key auto_increment, name varchar(20), age varchar(50))")

name = input("Enter name :")
age = input("Enter age :")

# 正确的参数化插入方式:表名单独格式化,数据用占位符传递
sql = "INSERT INTO %s (name, age) VALUES (%s, %s)"
myCursor.execute(sql % tn, (name, age))

# 必须提交事务,否则数据不会写入数据库
conn.commit()

print(f"Table {tn} created and data inserted successfully!")

# 关闭资源,避免泄漏
myCursor.close()
conn.close()

关键修正点说明

  • 参数传递修正:把(name, age)作为execute()的第二个参数传入,pymysql会自动处理字符串转义,既避免语法错误,又防止SQL注入。
  • 事务提交:pymysql默认是手动提交事务,执行插入/更新/删除操作后,必须调用conn.commit()才能把数据真正写入数据库。
  • 资源释放:养成用完就关闭游标和连接的习惯,避免占用数据库连接资源。
  • 表名处理:SQL规范里表名不能用参数化占位符,所以只能用字符串格式化,但生产环境一定要对用户输入的表名做严格校验,防止恶意输入。

额外提示

如果还是报错,可以检查:

  • root用户是否有cba数据库的建表和插入权限
  • cba数据库是否已经存在
  • 年龄字段如果存数字,建议改成int类型更合理

内容的提问来源于stack exchange,提问作者Bivek Kumar Jaiswal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:31:57