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

