gpt4 book ai didi

python - 迭代 sqlalchemy 的查询结果

转载 作者:行者123 更新时间:2023-11-29 02:57:16 25 4
gpt4 key购买 nike

我有一个这样的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”循环。该程序将挂起并且什么也不做(0 cpu 使用率)。我已经在我的本地 sql server 和我的亚马逊服务器上测试过了。当我直接在数据库上运行 sql 时,我返回了大约 800,000 行。为什么会这样?

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

最佳答案

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

  1. 使用 -v 标志运行 python,例如 python -v yourprogram.py

这有可能向您展示程序在哪里卡住了。

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

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

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

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

关于python - 迭代 sqlalchemy 的查询结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29407492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com