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
相关产品推荐
相关产品推荐

