You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pyodbc插入SQL Server数据停止提交,主键自增但数据回滚?

问题定位与解决方案

核心问题:未执行事务提交操作

你的测试脚本存在两处语法错误,直接导致事务未真正提交,最终数据被自动回滚:

  1. cursor.commit 未加括号,仅引用了方法对象,未实际调用提交操作
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 14:05:47