迭代 sqlalchemy 的查询结果

Iterating over query results from sqlalchemy

我有一个像这样的sql炼金术查询功能

def foo():
local_session = Session()
results = local_session.query(T.x, T.y, T.z, T.a, T.b, T.c
, T.d, T.e, T.f, T.g, T.h, T.i, T.j, T.k, T.l
, T.m, T.n, T.o, T.p, T.q, T.r, T.s, T.t, T.u
, T.v, 
User.gender).join(User)\
.filter(T.language == 'en', T.where_i_am_from == 'US',
User.some_num >= 0.9).limit(1000000)

local_session.close()
return results, results.count()

查询工作正常。 然后我在这里调用这个函数:

def fubar():

raw_data,raw_data_length = myModule.foo()

df = pd.DataFrame()
for each in raw_data:

    df = df.append(pd.DataFrame({ #add each.x etc to df..... }}


return df

问题是当我的 foo 查询的 .limit 超过 5000 或使用 .all() 或没有限制时,它不会迭代 "for each in raw_data" 循环。该程序将挂起而不执行任何操作(0 cpu 用法)。我已经在本地 sql 服务器和亚马逊服务器上对此进行了测试。当我 运行 sql 直接在数据库上我 return 大约 800,000 行。为什么会这样?

我正在使用最新的 mysql 和最新的 sqlalchemy。

这可能类似于 MySQL 驱动程序问题。我会按顺序执行以下操作:

  1. 运行 python 带有 -v 标志,如 python -v yourprogram.py

这可能会告诉您程序在哪里卡住了。

  1. 获取这 800,000 个结果并将它们与等效模式中的表一起保存在 SQLite 中。

这样做相对便宜,之后您要做的就是更改 SQA 数据库字符串。显然,这会告诉您问题出在驱动程序还是您的代码中。

  1. 您正在两个 类(TUser)之间进行连接 - 进行预加载而不是默认延迟加载。

如果您有 800,000 行并执行惰性连接,那可能会出现问题。添加一个 joinedloadeagerload 在早期版本的 SQLAlchemy 中)到 options.