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

使用pyodbc向MSSQL插入数据无报错但执行后数据未写入的问题咨询

问题原因
  • 你没有执行事务提交操作:pyodbc默认关闭自动提交(autocommit)配置,所有INSERT这类DML操作会暂存在事务缓存中,程序运行结束连接关闭后,未提交的事务会自动回滚,所以表中没有数据。
  • 代码存在冗余逻辑:你重复打开了两次本地文本文件,文件名获取逻辑也可以简化,不会影响插入但会增加不必要的IO开销。
修复方案
  1. 所有插入操作执行完成后,显式调用连接的commit()方法提交事务,或者在初始化连接时配置autocommit=True开启自动提交(显式提交更适合批量插入场景,出现异常可以统一回滚)。
  2. 优化冗余逻辑,增加异常捕获避免中间报错导致事务异常。
修复后参考代码
import pyodbc
import os

# 初始化连接时也可以加autocommit=True参数开启自动提交,就不需要后续手动commit
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=LAPTOP-LMBL29RS;DATABASE=mydb;UID=sa;PWD=123456')
cursor = cnxn.cursor()
path = 'testfiles'
files = os.listdir(path)

try:
    for f in files:
        filepath = os.path.join(path, f)
        # 直接取f就是当前文件名,不需要额外拼接取basename
        filename = f
        with open(filepath, "r", encoding="utf-8") as fp:
            lines = fp.read().splitlines()
        # 用enumerate替代count手动计数,更简洁
        for count, line in enumerate(lines):
            # 跳过表头行
            if count == 0:
                continue
            dataarr = line.split(',')
            if len(dataarr) == 8:
                print(dataarr[3])
                query = ('INSERT INTO final_tbl("Date","Open","High","Low","Close","Volume","OpenInt","filename") '
                         'VALUES(?,?,?,?,?,?,?,?)')
                cursor.execute(query, dataarr[0],dataarr[1],dataarr[2], dataarr[3], dataarr[4], dataarr[5],dataarr[6],filename)
    # 所有插入完成后统一提交事务
    cnxn.commit()
    print("所有数据插入成功")
except Exception as e:
    # 出现异常回滚事务
    cnxn.rollback()
    print(f"插入失败,已回滚,错误信息:{e}")
finally:
    # 关闭游标和连接
    cursor.close()
    cnxn.close()

内容的提问来源于stack exchange,提问作者Tamil Selvan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:30:01