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

使用SQLAlchemy向Azure SQL批量插入数据未持久化问题

解决SQLAlchemy执行BULK INSERT后数据未持久化的问题

我之前碰到过一模一样的情况!SSMS里跑BULK INSERT完全正常,Python里执行没报错但数据就是没存下来,核心原因其实是SQLAlchemy默认的事务机制——SSMS默认自动提交事务,但SQLAlchemy的连接会自动开启一个事务,你如果不手动提交,操作就会在会话结束时回滚,数据自然不会持久化。

具体解决办法

1. 手动提交事务

执行完BULK INSERT之后,直接调用连接的commit()方法就行:

query = ''' BULK INSERT mytable FROM '%s.csv' WITH (DATA_SOURCE = 'blobStorage', FIELDTERMINATOR = ',', ROWTERMINATOR = '\n', FIRSTROW=2) ''' % report_date
connection.execute(query)
# 关键一步:提交事务
connection.commit()

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

推荐用with语句管理连接,这样上下文退出时会自动帮你提交(如果没有异常的话),更安全:

from sqlalchemy import create_engine

engine = create_engine('你的Azure SQL连接字符串')
with engine.connect() as connection:
    query = ''' BULK INSERT mytable FROM '%s.csv' WITH (DATA_SOURCE = 'blobStorage', FIELDTERMINATOR = ',', ROWTERMINATOR = '\n', FIRSTROW=2) ''' % report_date
    connection.execute(query)
    # 也可以手动在这里commit,或者让上下文自动处理
    connection.commit()

3. 开启自动提交模式

如果你的场景里不需要事务控制,也可以在创建连接时直接开启自动提交:

connection = engine.connect().execution_options(isolation_level="AUTOCOMMIT")
query = ''' BULK INSERT mytable FROM '%s.csv' WITH (DATA_SOURCE = 'blobStorage', FIELDTERMINATOR = ',', ROWTERMINATOR = '\n', FIRSTROW=2) ''' % report_date
connection.execute(query)
# 这里不用手动commit,因为自动提交已经开启

额外验证小技巧

提交之后可以立刻查一下数据数量,确认是否插入成功:

count_result = connection.execute("SELECT COUNT(*) FROM mytable")
print(f"当前表中数据行数:{count_result.scalar()}")

既然SSMS里能成功,说明你的BULK INSERT语句和Blob数据源配置都没问题,只要搞定事务提交这一步,数据肯定能正常持久化啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:09:46