我正在使用 pandas.read_sql_query 函数读取一些 sql 文件。一个查询在我挑出的某一特定位处抛出错误。
(python 位 - 没有什么奇怪的并且可以与其他查询一起使用)
@contextmanager
def open_db_connection(connection_string):
pyodbc.pooling = False
connection = pyodbc.connect(connection_string)
try:
yield connection
except pyodbc.DatabaseError as err:
error, = err.args
sys.stderr.write(error.message)
finally:
connection.close()
noCount = """ SET NOCOUNT ON; """
with open_db_connection(connection_string) as conn:
res = pd.read_sql_query(noCount+queryObj, conn)
下面的 sql 语句抛出一个错误,我不知道为什么会这样。前面的语句和各种临时表可以工作,并且可以使用 pandas.read_sql_query() 进行收集,但是在接下来的位中它会中断。
IF OBJECT_ID('tempdb..#test1') IS NOT NULL DROP TABLE #test1;
select t.PositionID, b.SecurityID
into #test1
from #tmp as t
inner join placeholder.dbo.items as b on (b.PositionID = t.PositionID and b.StudyDate = '20191230')
where t.ast = 'eq';
IF OBJECT_ID('tempdb..#test2') IS NOT NULL DROP TABLE #test2;
select t.PositionID,
case
when count(i.beta_index)=0 then 1
else count(i.beta_index)
end as noIndex
into #test2
from #test1 as t
left join #beta_index as i on (t.SecurityID = i.isin)
group by t.PositionID;
select * from #test2
这应该从 test2 返回数据。但需要注意的是 - 它在 SQL Server Management Studio 中执行和运行得非常好。
最佳答案
问题一直是我忽略了 SSMS 中的警告消息,我相信这会导致游标不是查询,并且 pyodbc 抛出编程错误“没有结果。以前的 SQL 不是查询。”因此 pandas.read_sql_query() 崩溃。
警告:
Warning: Null value is eliminated by an aggregate or other SET operation.
查询开头的“SET ANSI_WARNINGS OFF”解决了该问题。
我不认为这是最好的做法,尽管就我而言,我可以忽略这些警告。
关于python - pandas.read_sql_query() 抛出 TypeError : 'NoneType' object is not iterable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60078342/