Python脚本中SQL执行成功但未提交,表未删除问题排查
解决Python中执行SQL删除表无效果的问题
核心原因
SQLAlchemy创建的连接默认处于事务模式,DDL操作(如DROP TABLE)需要显式提交才能生效,而SSMS默认是自动提交模式,这是两边执行结果不同的关键。
解决方案
方案1:手动提交事务
在执行SQL后添加提交操作,确保修改生效:
engine_azure2 = create_engine(conn_str2,echo=True) conn2 = engine_azure2.connect() deleteQuery = text("DECLARE @sql NVARCHAR(max)='' SELECT @sql += ' Drop table ' + QUOTENAME(TABLE_SCHEMA) + '.'+ QUOTENAME(TABLE_NAME) + '; ' FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' Exec Sp_executesql @sql") conn2.execute(deleteQuery) conn2.commit() # 显式提交事务 conn2.close() # 执行完成后关闭连接
方案2:使用上下文管理器(推荐)
通过with语句管理连接,自动处理事务的提交与回滚,代码更简洁安全:
engine_azure2 = create_engine(conn_str2,echo=True) deleteQuery = text("DECLARE @sql NVARCHAR(max)='' SELECT @sql += ' Drop table ' + QUOTENAME(TABLE_SCHEMA) + '.'+ QUOTENAME(TABLE_NAME) + '; ' FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' Exec Sp_executesql @sql") with engine_azure2.connect() as conn2: conn2.execute(deleteQuery) conn2.commit()
额外排查点
如果提交后仍无效果,可检查:
- 是否存在外键约束导致表无法删除(此时SQL应返回错误,可通过
echo=True的日志查看执行细节) - 连接字符串是否指向了正确的数据库实例
内容的提问来源于stack exchange,提问作者BlakeB9
相关产品推荐
相关产品推荐

