代码之家  ›  专栏  ›  技术社区  ›  ProgSky

Python Pandas read\u sql\u query-“NoneType”对象不可iterable–错误

  •  10
  • ProgSky  · 技术社区  · 7 年前

    我正在尝试执行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”对象不是iterable错误

    我可以运行myquery。sql server窗口中包含结果的sql。我确实有 SET NOCOUNT ON;

    有什么线索我在这里遗漏了什么,我该如何调试它吗?myquery。sql几乎没有临时表和联接。结果大约有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
    
    4 回复  |  直到 7 年前
        1
  •  7
  •   r.ook jpp    7 年前

    据我所知, read_sql_query() 无论如何,只会返回第一个语句的结果。在这种情况下 SET NOCOUNT ON; 正如你所看到的,会回来的 None ,这就是代码失败的原因。在我看来,您应该优化SQL语句,以便在过程中返回一个表,而不是多个表(因为您只想读取#final)。

    如果确实希望在一个数据帧中有多个sql查询,可以使用 lists split 如本帖所述:

    Pandas read_sql query with multiple selects

        2
  •  3
  •   Josef AshesAndDust    4 年前

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

    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 了解更多详细信息。

        3
  •  3
  •   N. Maks    3 年前

    有时tsql警告如下 Warning: Null value is Eliminated by an Aggregate or Other SET Operation 可能引发相同的问题行为 pd.read_sql() . 我发现,在这种情况下,另外关闭这些警告会有所帮助。为此,只需添加

    SET ANSI_WARNINGS OFF;
    

    除了你的 SET NOCOUNT ON; 陈述

    当然,你不应该忽视这些警告。在关闭警告之前,请检查结果是否符合预期。

        4
  •  0
  •   Gedas Miksenas    3 年前

    请尝试删除“SET NOCOUNT ON”后的分号,然后运行脚本。