我正在使用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
这应该会从test 2返回数据。不过需要注意的是-它在SQL Server Management Studio中执行和运行得非常好。
2条答案
按热度按时间hts6caw31#
The issue all along was that I was ignoring/disregarding warning messages in SSMS, which, I believe, results in cursor not being a query and pyodbc throwing ProgrammingError "No results. Previous SQL was not a query." and consequently pandas.read_sql_query() crashing.
警告:
警告:聚合或其他SET操作消除了Null值。
查询开头的"SET ANSI_WARNINGS OFF"解决了该问题。
我不认为这是最好的做法,虽然在我的情况下,我可以无视这些警告。
ttcibm8c2#
得到了这个答案,而搜索其他webistes,因为我得到了同样的问题,但teradata。
由于Teradata既没有设置NOCOUNT ON也没有设置ANSI_WARNINGS OFF,因此不得不求助于其他方法来解决这个问题。
没有使用read_sql,而是使用cursor对象来运行查询。
发出pd.read_sql(查询,会话)
下面使用Curr =会话.游标()curr.执行(查询)
下面是我得到答案的原始站点https://www.anycodings.com/1questions/4980247/nonetype-object-is-not-iterable-error-in-pandas