gpt4 book ai didi

python - SQLAlchemy 中的 with_entities 和 load_only 有什么区别?

转载 作者:太空狗 更新时间:2023-10-29 19:37:11 30 4
gpt4 key购买 nike

查询我的数据库时,我只想加载指定的列。使用 with_entities 创建查询需要引用模型列属性,而使用 load_only 创建查询需要与列名称对应的字符串。我更愿意使用 load_only,因为使用字符串创建动态查询更容易。两者有什么区别?

load_only documentation

with_entities documentation

最佳答案

有一些不同。丢弃不需要的列时最重要的一个(如问题中所示)是使用 load_only 仍会导致创建对象(模型实例),而使用 with_entities 将只需获取包含所选列值的元组即可。

>>> query = User.query
>>> query.options(load_only('email', 'id')).all()
[<User 1 using e-mail: n@d.com>, <User 2 using e-mail: n@d.org>]
>>> query.with_entities(User.email, User.id).all()
[('n@d.org', 1), ('n@d.com', 2)]

只加载

load_only() 延迟加载模型中的特定列。它从查询中删除。稍后您仍然可以访问所有其他列,但是当您尝试访问它们时将执行额外的查询(在后台)。

当您在数据库中存储用户图片之类的内容时,“仅加载”非常有用,但您不想在不需要时浪费时间传输图像。例如,当显示用户列表时,这可能就足够了:

User.query.options(load_only('name', 'fullname'))

with_entities

with_entities() 可以添加或删除(简单地说:替换)模型;您甚至可以使用它来修改查询,用您自己的函数替换所选实体,例如 func.count():

query = User.query
count_query = query.with_entities(func.count(User.id)))
count = count_query.scalar()

请注意,结果查询与 query.count() 不同,后者可能会更慢 - at least in MySQL (因为它生成子查询)。

with_entities 的额外功能的另一个例子是:

query = (
Page.query
.filter(<a lot of page filters>)
.join(Author).filter(<some author filters>)
)
pages = query.all()

# ok, I got the pages. Wait, what? I want the authors too!
# how to do it without generating the query again?

pages_and_authors = query.with_entities(Page, Author).all()

关于python - SQLAlchemy 中的 with_entities 和 load_only 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47192428/

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