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

使用pandas.read_sql执行DELETE语句报错:无返回行已自动关闭

解决SQLAlchemy+pandas执行DELETE语句报错的问题

问题原因

pd.read_sql() 是专门用来执行**返回结果集的SQL语句(比如SELECT)**的工具,而DELETE属于数据修改语句,不会返回任何行数据。当你用read_sql执行DELETE时,pandas试图读取不存在的结果集,就会触发ResourceClosedError。

正确解决方案

直接使用SQLAlchemy的连接对象执行修改语句,不要通过pandas的read_sql:

from sqlalchemy import create_engine, text

# 替换为你的数据库连接字符串
engine = create_engine("mssql+pyodbc://username:password@server/database?driver=ODBC+Driver+17+for+SQL+Server")

# 执行DELETE操作并提交
with engine.connect() as conn:
    conn.execute(text(''' DELETE FROM DATATABLE WHERE RECORD_MONTH = DATEADD(MONTH, DATEDIFF(MONTH, -1, GETDATE())-1, -1) '''))
    conn.commit()

关键说明

  • 必须调用conn.commit():SQLAlchemy 2.0+默认不会自动提交修改操作,手动提交才能让删除生效。
  • 用text()包裹SQL语句:这是SQLAlchemy 2.0+的要求,用于封装原始SQL,避免语法兼容问题。

为什么加SET NOCOUNT ON无效?

SET NOCOUNT ON只是关闭SQL Server返回的"影响行数"提示信息,但本质上DELETE语句仍然不会返回结果集,而read_sql始终期望获取可读取的结果行,所以无法解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 18:22:08