Python Pandas read_sql_query “'NoneType' 对象不可迭代”错误
Python Pandas read_sql_query “'NoneType' object is not iterable” error
我正在尝试执行 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 服务器 window 中 运行 myquery.sql 获得结果。我有 SET NOCOUNT ON;
知道我在这里遗漏了什么吗?我该如何调试它? myquery.sql 几乎没有#temp 表和连接。结果有大约 75k 行。谢谢大家。
更新:
我无法 post 确切的查询,但这就是查询的样子。
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
据我了解,无论如何,read_sql_query()
只会 return 您第一个语句的结果。在这种情况下,它是 SET NOCOUNT ON;
,如您所见,将是 return None
,这就是您的代码失败的原因。 IMO 你应该将你的 SQL 语句优化为 return 一个 table 而不是过程中的多个(因为你只想从我假设的#final 中读取)。
如果你真的想在一个数据框中有多个 sql 查询,你可以使用 lists
和 split
,如这个线程中提到的:
如@r.ook 所述,对 returns“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 了解更多详情。
有时像 Warning: Null value is Eliminated by an Aggregate or Other SET Operation
这样的 tsql 警告会触发 pd.read_sql()
的相同问题行为。我发现在这种情况下另外关闭这些警告会有所帮助。为此只需添加
SET ANSI_WARNINGS OFF;
除了你的 SET NOCOUNT ON;
声明。
当然你不应该忽略这些警告。在关闭警告之前检查您的结果是否符合预期。
请尝试删除“SET NOCOUNT ON”后的分号,然后 运行 脚本。
我正在尝试执行 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 服务器 window 中 运行 myquery.sql 获得结果。我有 SET NOCOUNT ON;
知道我在这里遗漏了什么吗?我该如何调试它? myquery.sql 几乎没有#temp 表和连接。结果有大约 75k 行。谢谢大家。
更新:
我无法 post 确切的查询,但这就是查询的样子。
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
据我了解,无论如何,read_sql_query()
只会 return 您第一个语句的结果。在这种情况下,它是 SET NOCOUNT ON;
,如您所见,将是 return None
,这就是您的代码失败的原因。 IMO 你应该将你的 SQL 语句优化为 return 一个 table 而不是过程中的多个(因为你只想从我假设的#final 中读取)。
如果你真的想在一个数据框中有多个 sql 查询,你可以使用 lists
和 split
,如这个线程中提到的:
如@r.ook 所述,对 returns“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 了解更多详情。
有时像 Warning: Null value is Eliminated by an Aggregate or Other SET Operation
这样的 tsql 警告会触发 pd.read_sql()
的相同问题行为。我发现在这种情况下另外关闭这些警告会有所帮助。为此只需添加
SET ANSI_WARNINGS OFF;
除了你的 SET NOCOUNT ON;
声明。
当然你不应该忽略这些警告。在关闭警告之前检查您的结果是否符合预期。
请尝试删除“SET NOCOUNT ON”后的分号,然后 运行 脚本。