Python 迭代sqlalchemy的查询结果
我有一个像这样的sqlalchemy查询函数Python 迭代sqlalchemy的查询结果,python,mysql,pandas,sqlalchemy,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)\ .filte
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”循环。程序将挂起,什么也不做(cpu使用率为0)。我已经在本地sql server和amazon server上对此进行了测试。当我直接在数据库上运行sql时,我返回大约800000行。为什么会这样
我正在使用最新的mysql和最新的sqlalchemy。这可能是mysql驱动程序的问题。我将按顺序执行以下操作:
-v
标志运行python,如python-vyourprogram.py
李>
这有可能向您显示程序在哪里卡住了
T
,User
)-执行即时加载,而不是默认的延迟加载如果您有800000行并且正在进行惰性连接,那么这可能是一个问题。在
选项中添加一个joinedload
(早期版本的SQLAlchemy中的渴望加载
)不是对您的问题的回答,而是对问题的另一部分的注释:我不确定这是创建数据帧的最佳方法。您可以尝试类似于df=pd.read\u sql(query.statement,query.session.bind)
的方法。我会尝试用以下rows=results.all()\n local\u session.close()\n cnt=len(rows)\n return rows,cnt
替换您的语句。我猜这与会话状态有关。谢谢。我将研究pandas方法。它是mysql驱动程序。我使用的是Oracles MYSQL连接器,切换到pymysql,它可以正常工作。