为了账号安全,请及时绑定邮箱和手机立即绑定

来自 pandas read_sql 的“TypeError:'NoneType' 对象不可迭代”

来自 pandas read_sql 的“TypeError:'NoneType' 对象不可迭代”

慕哥6287543 2022-05-24 15:12:04
我正在尝试在 python 中使用 pyodbc 运行 SQL 命令。其中 SQL 命令包含多个 SELECT 命令和 IF 语句。但我收到如下错误columns = [col_desc[0] for col_desc in cursor.description]TypeError: 'NoneType' object is not iterableimport pyodbcimport pandas as pdconn = pyodbc.connect("DRIVER={SQL Server};"                "SERVER=server_name;"                "DATABASE=master;"                "Trusted_Connection=yes;")cursor = conn.cursor()script="""If object_id ('tempdb..#Temp1')is not nulldrop table #Temp1Select distinct  a1.some_ID into #Temp1from DOC.dbo.Document_tbl (NOLOCK)a1from #Temp1 a1If object_id ('tempdb..#Temp2')is not nullDrop table #Temp2select distinct v2.some_datainto #Temp2 from tbl_name (nolock) v2 If object_id ('tempdb..#Results')is not nulldrop table #Resultsselect distinct a1.*,b1.####into #Resultsfrom #Temp1 a1left join #Temp2 b1 on a1.## = b1.##Select * from #Results"""df = pd.read_sql(script, cnxn)writer = pd.ExcelWriter('result.xlsx')df.to_excel(writer, sheet_name ='bar')writer.save()
查看完整描述

2 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

包含多个 SQL 语句的 SQL 命令文本称为匿名代码块。一个匿名代码块可以返回多个结果,其中每个结果可以是

  • 行数,

  • 包含零行或多行数据的结果集,或

  • 一个错误。

以下示例失败...

sql = """\

SELECT 1 AS foo INTO #tmp;

SELECT * FROM #tmp;

"""

df = pd.read_sql_query(sql, cnxn)

# TypeError: 'NoneType' object is not iterable

...因为第一个在第二个返回其结果集SELECT ... INTO之前返回行数。SELECT


修复方法是启动匿名代码块,使用SET NOCOUNT ON;该代码块抑制行数并仅返回结果集:


sql = """\

SET NOCOUNT ON;

SELECT 1 AS foo INTO #tmp;

SELECT * FROM #tmp;

"""

df = pd.read_sql_query(sql, cnxn)

# no error


查看完整回答
反对 回复 2022-05-24
?
梦里花落0921

TA贡献1772条经验 获得超6个赞

对于仍然遇到此错误的其他任何人,我发现对于某些语句(聚合空值的窗口函数),我还需要包含SET ANSI_WARNINGS OFF;.



查看完整回答
反对 回复 2022-05-24
  • 2 回答
  • 0 关注
  • 373 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号