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

