Python 3.6中MySQL INSERT INTO语句无法执行问题求助
排查Python 3.6插入MySQL数据无报错但未生效的问题
这种情况我之前踩过坑!语法没问题、执行不报错但数据没进库,大概率是事务未提交或者隐性的配置/逻辑问题,咱们一步步来排查:
1. 最常见原因:事务未提交
MySQL默认是关闭自动提交的,哪怕你执行了INSERT语句,只要没手动提交,数据只会留在内存的事务里,不会写入磁盘的数据库。解决方法很简单:
- 在执行完插入语句后,调用连接对象的
commit()方法:
cursor.execute(your_insert_sql) conn.commit() # 关键!别漏了这一步
2. 开启自动提交避免重复踩坑
如果不想每次都手动写commit(),可以在建立数据库连接时直接开启自动提交:
import pymysql conn = pymysql.connect( host='你的主机地址', user='用户名', password='密码', db='目标数据库', charset='utf8mb4', autocommit=True # 开启自动提交,执行操作后自动生效 )
3. 验证插入语句是否真的执行了
有时候看起来代码跑了,但其实分支没走到或者参数有问题,可以在execute后打印受影响行数:
row_count = cursor.execute(your_insert_sql, params) print(f"受影响行数:{row_count}")
如果输出是0,说明语句根本没生效,得检查你的setcommand里是不是正确调用了执行逻辑,或者参数传递有没有空值/不匹配的情况。
4. 排查隐性错误(别让异常“隐身”)
如果你的代码里有try-except块,但没打印异常信息,可能一些隐性错误(比如字段类型不匹配、唯一键冲突、表名写错)被掩盖了。建议在捕获异常时输出具体错误:
try: cursor.execute(your_insert_sql, params) conn.commit() except Exception as e: print(f"插入失败原因:{str(e)}") conn.rollback() # 出错时回滚事务
5. 确认连接的数据库和表是否正确
有时候会不小心连接到测试库,或者表名大小写不匹配(MySQL在Linux环境下区分表名大小写)。可以直接把生成的SQL语句复制到MySQL客户端里执行,看看能不能成功插入——如果客户端能成功,那问题肯定出在Python代码的提交/逻辑上。
给你一个参考的正确示例
结合上面的点,写一个完整的插入示例:
import pymysql def insert_data(): conn = None cursor = None try: # 建立连接,可选开启自动提交 conn = pymysql.connect( host='localhost', user='root', password='your_password', db='test_db', charset='utf8mb4' ) cursor = conn.cursor() # 插入语句(用参数化查询避免SQL注入) sql = "INSERT INTO user (name, age) VALUES (%s, %s)" params = ("张三", 25) row_count = cursor.execute(sql, params) conn.commit() # 手动提交 print(f"成功插入 {row_count} 条数据") except Exception as e: print(f"插入出错:{str(e)}") if conn: conn.rollback() finally: # 关闭游标和连接 if cursor: cursor.close() if conn: conn.close() if __name__ == "__main__": insert_data()
你可以结合自己的setcommand和getcommand代码,对照上面的点逐一排查,优先检查事务提交的问题,这是最容易忽略的环节!
内容的提问来源于stack exchange,提问作者Chongju Mai
相关产品推荐
相关产品推荐

