多行SQL在SQLAlchemy执行报错:结果对象无返回行
问题解决方法
原因分析
你遇到的问题是因为用multi=True执行多语句SQL时,ODBC驱动会依次返回每个语句的结果对象——前面的DECLARE、INSERT、UPDATE都是无返回行的操作,直接调用fetchall()会先处理第一个无返回的结果,触发报错。
解决方法一:遍历结果对象,提取有效结果
手动遍历所有返回的结果对象,跳过无行返回的操作,只保留最后SELECT语句的结果:
results = self.connection.execute(qry, multi=True) final_data = None for res in results: try: # 仅SELECT语句能成功获取行数据 final_data = res.fetchall() except Exception: # 跳过无返回的操作(如DECLARE/INSERT/UPDATE) continue df = pd.DataFrame(final_data)
解决方法二:在SQL开头添加SET NOCOUNT ON
在你的SQL语句最前面加上SET NOCOUNT ON;,它会抑制INSERT、UPDATE等操作返回的“影响行数”消息,让驱动只返回最终SELECT的结果集,此时甚至不需要multi=True:
# 给原SQL加上SET NOCOUNT ON前缀 qry = "SET NOCOUNT ON;" + qry # 无需multi=True,直接执行并获取结果 result = self.connection.execute(qry).fetchall() df = pd.DataFrame(result)
内容的提问来源于stack exchange,提问作者Lukas Fürst
相关产品推荐
相关产品推荐

