在使用sqlalchemy和pandas查询数据库结果时,总是出现错误“This result object does not return rows. It has been closed automatically.”
尝试将sqlalchemy的版本更新到最新或者降级到1.3,都无法解决这个问题。怀疑是SQL语句有问题,经过重复调试SQL脚本,发现有2个问题:
1.使用了USE语句切换数据库。
2.使用了SELECT INFO语句创建临时表
由于SQLAlchemy 的 create_engine()
函数用于创建一个引擎(Engine),这个引擎会连接到特定的数据库(通过连接字符串中的数据库名称或其他参数),不能直接使用 SQL 的 USE
语句来切换数据库。
SQLAlchemy本身并不直接支持SQL中的SELECT INTO
语句作为其核心功能,需要通过一些自定义和扩展才能实现SELECT INTO
的功能,所以这里需要使用CTE语句。
解决方案:将USE语句注释掉或删除;使用CTE替代SELECT INFO
另外,如果确实需要切换数据库(在支持多个数据库的 SQL Server 实例中),可能需要:
- 创建一个新的连接字符串,指向不同的数据库。
- 使用这个新的连接字符串创建一个新的引擎。
- 使用这个新的引擎来执行你的查询。
但请记住,这种方法可能会导致更多的资源消耗,因为每个数据库连接都需要一个独立的引擎。在大多数情况下,最好是在应用程序开始时确定需要连接的数据库,并在整个应用程序生命周期中保持这个连接。如果需要在不同的数据库之间切换,可能需要重新考虑应用程序架构或数据库设计。