Python写入MySQL数据库失败:数据未存入却无报错该如何排查?
问题原因与解决方法
核心问题:未真正执行事务提交与资源关闭
你的代码里有三个关键错误,都是方法没加括号调用:
sql_db.commit:这只是引用了commit方法,没有执行提交操作。MySQL默认需要手动调用commit()来确认事务,否则所有写入操作会在连接关闭时自动回滚,数据根本不会落到数据库里。mycursor.close和sql_db.close:同样没有调用关闭方法,属于无效操作。
而且print(mycursor.rowcount, "record inserted.")放在close之后,此时cursor已经失效,这个rowcount的值不可信,才会出现控制台提示插入成功但数据库为空的矛盾情况。
修复后的代码片段
mycursor = sql_db.cursor() sql = "INSERT INTO users (discord_id, platform, gamertag) VALUES (%s, %s, %s)" val = (interaction.user.id, platform.value, gamertag) print(val) try: mycursor.execute(sql, val) # 必须加括号执行提交 sql_db.commit() # 提交成功后再输出行数,此时rowcount才是有效的 print(mycursor.rowcount, "record inserted.") except mysql.connector.Error as err: print(err) print("Error Code:", err.errno) print("SQLSTATE:", err.sqlstate) print("Message:", err.msg) # 出错时回滚事务 sql_db.rollback() finally: # 不管成功失败,都要关闭cursor和连接 mycursor.close() sql_db.close()
排查数据写入问题的实用方法
- 强制事务提交检查:确保
commit()被正确调用,并且把它放在try块内,因为提交操作本身也可能抛出错误(比如网络中断、权限不足)。 - 增加插入后即时验证:在commit后执行一条查询语句,比如
SELECT * FROM users WHERE discord_id = %s,传入对应的id,打印查询结果,确认数据是否真的存在。 - 查看MySQL服务器日志:登录VPS上的MySQL,查看错误日志(通常在
/var/log/mysql/error.log)或慢查询日志,排查是否有事务回滚、权限拒绝等后台报错。 - 检查自动提交设置:可以在连接数据库时设置
autocommit=True(比如sql_db = mysql.connector.connect(..., autocommit=True)),但手动提交更适合复杂操作,建议优先修复commit调用。 - 捕获更广泛的异常:除了
mysql.connector.Error,可以增加Exception捕获通用错误,避免遗漏非数据库类的异常。
内容的提问来源于stack exchange,提问作者jcK.
相关产品推荐
相关产品推荐

