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

