Python Pandas read_sql_query“'NoneType'对象不可迭代”错误

时间:2018-01-16 18:11:14

标签: python python-2.7 pyodbc

我正在尝试执行sql并将结果保存到Panda Dataframe中。这是我的代码。

        dbserver = 'validserver'
        filename = 'myquery.sql'
        database  ='validdb'       
        conn = pyodbc.connect(r'Driver={SQL Server};Server=' + dbserver + 
            ';Database=' + database + ';Trusted_Connection=yes;')
        fd = open(filename, 'r')
        resultingData = pd.read_sql_query(fd.read(),conn)
        fd.close()
        conn.close()

pd.read_sql_query(fd.read(),conn)继续给我错误 'NoneType'对象不可迭代“错误

我可以在带有结果的sql server窗口中运行myquery.sql。我有SET NOCOUNT ON;

任何线索我在这里缺少什么,我该如何调试? myquery.sql有很少的#temp表和连接。结果大约有75k行。谢谢大家。

更新:

我无法发布确切的查询,但这是查询的样子。

SET NOCOUNT ON;

SELECT SourceID, PeriodEndDate = MAX(PeriodEndDate)
INTO #SourceDate 
FROM table1
WHERE PERIODENDDATE <= 20171229
GROUP BY SourceID

SELECT RS.*, R.TypeCode INTO #final
FROM table2 RS
INNER JOIN #SourceDate SD ON SD.id = RS.id
INNER JOIN table3 R ON R.id = RS.id

select * from #final

2 个答案:

答案 0 :(得分:2)

正如@r.ook 提到的,对于返回“NoneType”的每个语句使用 SET NOCOUNT ON;。因此,您的陈述可能是:

SET NOCOUNT ON;
SELECT SourceID, PeriodEndDate = MAX(PeriodEndDate)
INTO #SourceDate 
FROM table1
WHERE PERIODENDDATE <= 20171229
GROUP BY SourceID

SET NOCOUNT ON; --Added "SET NOCOUNT ON;" here as well.
SELECT RS.*, R.TypeCode INTO #final
FROM table2 RS
INNER JOIN #SourceDate SD ON SD.id = RS.id
INNER JOIN table3 R ON R.id = RS.id

select * from #final

您也可以查看this link了解更多详情。

答案 1 :(得分:1)

根据我的理解,read_sql_query()无论如何只能从你的第一句话中返回结果。在这种情况下,它是SET NOCOUNT ON;,如您所见,将返回None,这就是您的代码失败的原因。 IMO你应该优化你的SQL语句,以便在进程中返回一个表而不是多个表(因为你只想读取#final我假设)。

如果您确实希望在数据框中有多个sql查询,可以使用此线程中提到的listssplit

Pandas read_sql query with multiple selects