【发布时间】:2018-09-24 15:10:02
【问题描述】:
我遇到了以下帖子,这是我的确切情况。我有一个大型 SQL 查询,格式如下:
SET NOCOUNT ON
CREATE TABLE x
INSERT INTO x
CREATE TABLE y
INSERT INTO y
.
.
.
SELECT * FROM x join y
where a
UNION
SELECT * FROM x join y
where b
查询运行良好,按预期返回超过 15k 行。当我尝试将其读入 python 中的数据框时,我得到“NoneType”对象不可迭代错误,如下面的链接所述。我看到原始海报将他的查询转换为存储过程。我想知道是否有另一种方法可以解决此错误,而无需编写存储过程。
Python Pandas read_sql_query “'NoneType' object is not iterable” error
更新 - 插入 python 代码
server = 'server'
query = 'test.sql'
db ='db'
conn = pyodbc.connect(r'Driver={SQL Server};Server=' + dbserver + ';Database=' + database + ';Trusted_Connection=yes;')
fd = open(query, 'r')
df = pd.read_sql_query(fd.read(),conn)
fd.close()
conn.close()
【问题讨论】:
-
你好,你的python代码也可以吗?
-
read_sql本质上是用于读取 table/sql 并获取行。您可以单独运行这些 create 语句,并在查询中单独保留带有 union 的 select 语句。另一种方式当然是创建存储过程。 -
@mad_ 我试过你提到的。我基本上将创建语句拆分为一个 SQL,并使用 read_sql_query 写入数据帧。然后我对 select 语句做了同样的事情,我使用 read_sql_query 将它写入一个单独的数据帧。这导致了同样的错误。
-
您能发布一下您是如何执行这些语句的吗?
-
;基本上将在大多数数据库中将每个查询彼此分开。 pandas.pydata.org/pandas-docs/version/0.22/generated/… docs 显示 read_sql 适合读取 pandas 数据帧中的表,但不适合 sql 执行。您有pyodbc驱动程序,您可以使用它来运行您的创建语句。看看这个stackoverflow.com/questions/7744742/…。我认为您可以使用 pyodbc 执行语句运行一系列查询。