迭代sqlalchemy的查询结果

时间:2015-04-02 07:36:42

标签: python mysql pandas sqlalchemy

我有像这样的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。

1 个答案:

答案 0 :(得分:1)

这可能就像MySQL驱动程序问题一样。我会按顺序执行以下操作:

  1. 使用-v标记运行python,如python -v yourprogram.py
  2. 这有可能向您展示程序卡住的位置。

    1. 获取这800,000个结果并将它们粘贴在SQLite中,并使用等效模式的表。
    2. 这样做相对便宜,之后您需要做的就是更改SQA数据库字符串。显然,这会告诉你问题是驱动程序还是代码中的问题。

      1. 您正在两个类之间进行连接(TUser) - 执行急切加载而不是默认的延迟加载。
      2. 如果您有800,000行并进行延迟连接,则可能会出现问题。在早期版本的SQLAlchemy中添加joinedloadeagerload)到options