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

Pandas to_sql插入MSSQL异常:显示插入行数但数据库无数据

解决DataFrame.to_sql()显示插入行数但MSSQL无数据的问题

核心原因

SQLAlchemy通过engine.connect()创建的连接默认处于手动事务模式,所有操作都在未提交的事务中执行。若未显式提交事务,连接关闭时会自动回滚所有操作,导致数据库中看不到插入的数据。你开启IDENTITY_INSERT的操作和to_sql()属于同一会话,设置本身没问题,但事务未提交是数据未落地的关键原因。

可行解决方案

1. 显式提交事务

在插入操作后添加事务提交语句,同时记得关闭IDENTITY_INSERT(规范操作):

conn = engine.connect()

try:
    conn.exec_driver_sql("SET IDENTITY_INSERT [dbo].[my_table] ON")
    data_frame.to_sql('[dbo].[my_table]', conn, schema='dbo', if_exists='append', index=False)
    conn.commit()  # 提交事务,让数据写入数据库
finally:
    conn.exec_driver_sql("SET IDENTITY_INSERT [dbo].[my_table] OFF")
    conn.close()

2. 使用上下文管理器自动管理事务

用with语句创建连接,会自动处理事务的提交与回滚,代码更简洁安全:

with engine.connect() as conn:
    conn.exec_driver_sql("SET IDENTITY_INSERT [dbo].[my_table] ON")
    data_frame.to_sql('[dbo].[my_table]', conn, schema='dbo', if_exists='append', index=False)
    conn.commit()
    conn.exec_driver_sql("SET IDENTITY_INSERT [dbo].[my_table] OFF")

额外检查项

  • 确认data_frame的数据类型与目标表字段类型完全匹配,避免隐性转换导致插入失效(即使to_sql()返回行数)
  • 查看SQL Server的事务日志,确认是否存在事务回滚的记录
  • 确保data_frame中包含目标表的IDENTITY列数据,且开启IDENTITY_INSERT后确实允许对该列插入值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 07:52:29