使用pyodbc插入SQL Server数据停止提交,主键自增但数据回滚?
问题定位与解决方案
核心问题:未执行事务提交操作
你的测试脚本存在两处语法错误,直接导致事务未真正提交,最终数据被自动回滚:
cursor.commit未加括号,仅引用了方法对象,未实际调用提交操作cnxn.close未加括号,未正确执行连接关闭逻辑
修正后的基础脚本
import pyodbc SQL_DRIVER = 'SQL Server Native Client 11.0' SQL_OUTPUT_TABLE = "test" SERVER = "myServer" DATABASE = "myDB" def main(): cnxn = pyodbc.connect(f'DRIVER={{{SQL_DRIVER}}};SERVER={SERVER};DATABASE={DATABASE};Trusted_Connection=yes') cursor = cnxn.cursor() tsql = "insert into [dbo].[test](col1) values ('stuff');" cursor.execute(tsql) cursor.commit() # 调用提交方法完成事务 cnxn.close() # 调用关闭方法释放连接 if __name__ == '__main__': main()
更可靠的优化写法
使用上下文管理器(with语句)自动处理事务提交和资源释放,避免手动操作遗漏:
import pyodbc SQL_DRIVER = 'SQL Server Native Client 11.0' SERVER = "myServer" DATABASE = "myDB" def main(): conn_str = f'DRIVER={{{SQL_DRIVER}}};SERVER={SERVER};DATABASE={DATABASE};Trusted_Connection=yes' # 上下文管理器会自动提交事务并关闭连接 with pyodbc.connect(conn_str) as cnxn: with cnxn.cursor() as cursor: tsql = "insert into [dbo].[test](col1) values ('stuff');" cursor.execute(tsql) if __name__ == '__main__': main()
额外排查建议
如果修正后问题仍存在,可检查以下内容:
- 确认Python使用的Windows账户(Trusted_Connection模式)是否仍具备目标表的插入与事务提交权限
- 查看SQL Server的事务日志,确认是否存在异常回滚记录
- 执行
SET IMPLICIT_TRANSACTIONS OFF语句,关闭隐式事务模式,避免自动开启未提交的事务
内容的提问来源于stack exchange,提问作者Zarty
相关产品推荐
相关产品推荐

