Python脚本执行Insert查询成功但SQL Server未保存数据的原因排查
问题描述
我编写了一个包含两个函数的Python脚本:一个用于向SQL Server表中插入数据,另一个用于读取表数据。调用插入函数时,数据并未保存到数据库中,但直接在SQL Server执行相同的Insert查询却能正常生效。防火墙配置无误,且表的主键为IDENTITY列,执行插入函数时该列仍会自动递增,但无数据留存。附上脚本截图、SQL Server信息截图及建表语句截图,恳请协助排查问题。
排查方案
- 检查事务提交逻辑:Python连接SQL Server时默认会开启事务,若执行插入后未手动提交,数据会自动回滚。无论使用
pyodbc还是pymssql,都要确认插入操作后调用了conn.commit()。示例:def insert_data(conn, data): cursor = conn.cursor() cursor.execute("INSERT INTO your_table(col1, col2) VALUES(?, ?)", data) conn.commit() # 必须执行提交操作 cursor.close() - 核对连接字符串的自动提交配置:部分驱动支持在连接字符串中设置
autocommit=True,比如pyodbc的连接字符串可追加;autocommit=True,实现语句执行后自动提交,无需手动调用commit。 - 检查异常捕获是否吞掉错误:若脚本中的try-except块忽略了异常,可能导致事务因错误回滚却未被察觉。确认捕获异常后是否打印或处理了错误信息,避免因静默失败导致数据丢失。
- 验证连接的数据库实例与库名:排查脚本连接的数据库是否和手动执行SQL时使用的实例、库名一致,避免因连接到测试库/其他实例导致数据看不到。
- 分析IDENTITY列递增的本质:IDENTITY值递增仅说明Insert语句被执行过(即使事务回滚,IDENTITY值也不会回滚),这一现象恰好佐证了语句已执行但未提交的可能性。
- 查看SQL Server事务日志:通过
DBCC LOG工具或SQL Server的事务日志查看功能,确认是否存在对应的插入操作及回滚记录,进一步验证事务未提交的猜测。
内容的提问来源于stack exchange,提问作者Jean-baptiste Briois
相关产品推荐
相关产品推荐

