gpt4 book ai didi

python - 如何跳过结果中的 ORM 开销?

转载 作者:行者123 更新时间:2023-12-01 01:12:25 27 4
gpt4 key购买 nike

我有一个 ORM sqlalchemy 模型,我需要构建一个查询(使用 ORM 类更容易构建),但这需要大量时间。当我直接像 SQL 一样向数据库执行相同的查询时,速度相当快。

使用 SQLAlchemy 文档 https://docs.sqlalchemy.org/en/latest/faq/performance.html 中提供的配置文件函数我发现确实是ORM增加了巨大的开销。

但是,查询结果是在好几段代码中使用的,到处改起来很头疼。

查询如下所示:

q = ( session.query(T1, T2)
.select_from(sub_query)
.join(T1, sub_query.c.id == T1.id)
.join(T2, sub_query.c.id==T2.id)
.filter(T1.user == 1)
.order_by(T1.group, T1.position)
)

这些行不会被修改,它们只是使用 T1 和 T2 属性读取。 (我的意思是,我不需要获取 T1 和 T2 对象,只需获取属性与 T1 和 T2 的列名称匹配的原始对象之类的东西)

有没有办法加快速度(消除 ORM 开销),以便我可以使用相同的语法访问它们,例如

for t1, t2 in q.all():
print(t1.x, t2.x)

我已经尝试过sqlalchemy.orm.Bundle,但我得到类似“Bundle is not selectable”(当然是由于连接)的信息

最佳答案

如果您希望继续使用 SQLAlchemy,但在这种特殊情况下避免 ORM 的开销,您可以使用 Bundle 正如您尝试过的:

from sqlalchemy import inspect
from sqlalchemy.orm import Bundle

def to_bundle(cls, label=None):
return Bundle(label or cls.__name__,
*[c.class_attribute for c in inspect(cls).column_attrs])

q = ( session.query(to_bundle(T1), to_bundle(T2))
.select_from(sub_query)
.join(T1, sub_query.c.id == T1.id)
.join(T2, sub_query.c.id==T2.id)
.filter(T1.user == 1)
.order_by(T1.group, T1.position)
)

您不应将 bundle 传递给 Query.join() ,但是映射的类。 bundle 将从连接结果中选取列。如果您确实传递了 bundle ,则会收到错误:

AttributeError: 'Bundle' object has no attribute 'selectable'

关于python - 如何跳过结果中的 ORM 开销?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54724847/

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