我有像这样的sqlalchemy查询功能
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
问题在于它不会遍历"对于raw_data中的每一个"当我的foo查询高于5000时,我有一个.limit,或者使用.all()或没有限制。该程序将挂起并不执行任何操作(0 cpu使用)。我已经在我的本地sql服务器和我的亚马逊服务器上测试了这个。当我直接在数据库上运行sql时,我返回大约800,000行。为什么会这样?
我使用的是最新的mysql和最新的sqlalchemy。
答案 0 :(得分:1)
这可能就像MySQL驱动程序问题一样。我会按顺序执行以下操作:
-v
标记运行python,如python -v yourprogram.py
。 这有可能向您展示程序卡住的位置。
这样做相对便宜,之后您需要做的就是更改SQA数据库字符串。显然,这会告诉你问题是驱动程序还是代码中的问题。
T
,User
) - 执行急切加载而不是默认的延迟加载。如果您有800,000行并进行延迟连接,则可能会出现问题。在早期版本的SQLAlchemy中添加joinedload
(eagerload
)到options
。