我正在尝试使用pandas.read\u sql\u query读取sql查询。
几周前我还没谈到这些问题。问题是,当我阅读一些查询时,会出现以下错误:
df = pd.read_sql_query(sql = query_string, con = engine)
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
~\.conda\envs\test\lib\site-packages\sqlalchemy\engine\result.py in _fetchall_impl(self)
1160 try:
-> 1161 return self.cursor.fetchall()
1162 except AttributeError:
AttributeError: 'NoneType' object has no attribute 'fetchall'
During handling of the above exception, another exception occurred:
ResourceClosedError Traceback (most recent call last)
...
~\.conda\envs\test\lib\site-packages\sqlalchemy\engine\result.py in _non_result(self, default)
1166 if self._metadata is None:
1167 raise exc.ResourceClosedError(
-> 1168 "This result object does not return rows. "
1169 "It has been closed automatically."
1170 )
ResourceClosedError: This result object does not return rows. It has been closed automatically.
这只发生在使用某些查询时,而不是其他查询时,所以我知道这不是我的连接。我在这两个语句上都设置了nocount,并且都使用temp表。有人能告诉我为什么一个查询有效,而另一个查询无效吗?两者都在ssms中工作良好。我试着在下面提供这两种语言的基本结构。第一个有效,第二个无效。
set nocount on
DECLARE @var1 varchar(20)= 'sometext'
IF OBJECT_ID('tempdb..#temp1', 'U') IS NOT NULL
DROP TABLE #temp1
select * into #temp1 from some_function_view WHERE [x] = @var1
IF OBJECT_ID('tempdb..#temp2', 'U') IS NOT NULL
DROP TABLE #temp2
select * into #temp2 FROM another_view JOIN ...
SELECT Main.[y]...
FROM (
SELECT *
FROM another_view
JOIN...
WHERE...
GROUP BY...
) Main
JOIN #temp2...
set nocount on
begin try drop table #temp1 end try begin catch end catch
begin try drop table #temp2 end try begin catch end catch
begin try drop table #temp3 end try begin catch end catch
DECLARE @x int = 202007
DECLARE @y int = 2016
SELECT * into #temp1 FROM a_view
SELECT * into #temp2
FROM a_view
JOIN (SELECT...FROM a_view WHERE...GROUP BY ...)
SELECT... into #temp3 FROM a_view
JOIN...
LEFT JOIN...
WHERE x = @x, y = @y...
Group BY...
SELECT *
FROM #policy as FPFR
JOIN #temp1...
JOIN #temp2...
JOIN #temp3...
ORDER BY...
1条答案
按热度按时间kqlmhetl1#
所以我想出来了。我需要在sql查询中包含“setansi\u warnings off”和“setnocount on”。
有一个或另一个是不够的。两者的结合能够捕获sql抛出的任何存储过程错误,以便python能够成功地读取它。