Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 迭代sqlalchemy的查询结果_Python_Mysql_Pandas_Sqlalchemy - Fatal编程技术网

Python 迭代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

我有一个像这样的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
问题是,当我的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
    这有可能向您显示程序在哪里卡住了

  • 获取这些800000个结果,并将它们粘贴到SQLite中,其中包含等效模式中的表 这样做相对便宜,之后只需更改SQA数据库字符串。显然,这将告诉您问题是出在驱动程序还是代码中

  • 您正在两个类之间进行连接(
    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,它可以正常工作。