Python中%s格式化的正确使用问题(pymysql插入语句报错)
解决pymysql插入语句执行错误的问题
我来帮你排查这个问题,你插入语句那行的语法有两个关键错误,咱们一步步来修正:
错误原因分析
- execute方法参数传递错误:你把插入的参数
(name, age)写在了execute()方法的括号外面,这会导致参数根本没被传递给SQL语句,而且语法本身就不合法。 - 字符串格式化拼接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
相关产品推荐
相关产品推荐

