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

pandas to_sql写入SQL Server无记录无报错如何排查

问题描述

使用如下Python代码尝试将pandas DataFrame写入SQL Server对应表:

from sqlalchemy import create_engine
import pandas as pd

engine = create_engine("connection string")
conn_obj = engine.connect()

my_df = pd.DataFrame({'col1': ['29199'], 'date_created': ['2022-06-29 17:15:49.776867']})
my_df.to_sql('SomeSQLTable', conn_obj, if_exists='append', index = False)

目标表SomeSQLTable已提前通过如下SQL脚本创建:

CREATE TABLE SomeSQLTable(
col1 nvarchar(90),
date_created datetime2)
GO

代码运行全程无报错,但执行完成后查询目标表无任何插入记录。已验证连接对象状态正常,可正常从数据库拉取查询数据。

问题根因

该现象由SQLAlchemy默认事务机制导致:手动调用engine.connect()获取的连接默认开启隐式事务,所有DML写入操作(包括INSERT/UPDATE/DELETE)执行完成后必须显式提交事务,否则连接释放时所有未提交的操作都会被自动回滚。
可以正常通过该连接执行查询,是因为SELECT操作不需要事务提交即可返回结果,不代表写入操作会自动持久化到磁盘。

修复方案
  • 方案1(推荐):直接将engine对象传给to_sql,不要手动创建connect连接对象,pandas内部会自动处理连接生命周期和事务提交,修改后代码如下:
from sqlalchemy import create_engine
import pandas as pd

engine = create_engine("connection string")
my_df = pd.DataFrame({'col1': ['29199'], 'date_created': ['2022-06-29 17:15:49.776867']})
my_df.to_sql('SomeSQLTable', engine, if_exists='append', index = False)
  • 方案2:如果必须手动管理连接,执行完to_sql之后显式调用commit()方法提交事务,操作完成后关闭连接:
from sqlalchemy import create_engine
import pandas as pd

engine = create_engine("connection string")
conn_obj = engine.connect()

my_df = pd.DataFrame({'col1': ['29199'], 'date_created': ['2022-06-29 17:15:49.776867']})
my_df.to_sql('SomeSQLTable', conn_obj, if_exists='append', index = False)
conn_obj.commit() # 显式提交事务
conn_obj.close()
  • 方案3:创建连接时开启自动提交参数,无需手动调用commit:
from sqlalchemy import create_engine
import pandas as pd

engine = create_engine("connection string")
conn_obj = engine.connect().execution_options(autocommit=True)

my_df = pd.DataFrame({'col1': ['29199'], 'date_created': ['2022-06-29 17:15:49.776867']})
my_df.to_sql('SomeSQLTable', conn_obj, if_exists='append', index = False)
排查验证步骤
  • 执行完写入代码后不要立刻断开连接,在同一会话内执行SELECT * FROM SomeSQLTable,如果同会话能查到数据、断开重连后查不到,可100%确认是事务未提交导致的回滚。
  • 检查连接字符串指向的实例、库名是否正确,排除连错环境(如写入测试库却在生产库查询)的问题。
  • 确认写入使用的账号具备目标表的INSERT权限,部分SQL Server权限配置下,账号无对应写入权限时不会抛出显性报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 20:09:18