- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
查询我的数据库时,我只想加载指定的列。使用 with_entities
创建查询需要引用模型列属性,而使用 load_only
创建查询需要与列名称对应的字符串。我更愿意使用 load_only
,因为使用字符串创建动态查询更容易。两者有什么区别?
最佳答案
有一些不同。丢弃不需要的列时最重要的一个(如问题中所示)是使用 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()
可以添加或删除(简单地说:替换)模型 或列;您甚至可以使用它来修改查询,用您自己的函数替换所选实体,例如 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/
我只想从我的模型中选择几列来加速查询,但我想要选择的列之一来自关系。 楷模: class OpenChromatinRegion(db.Model): ... gene_id
查询我的数据库时,我只想加载指定的列。使用 with_entities 创建查询需要引用模型列属性,而使用 load_only 创建查询需要与列名称对应的字符串。我更愿意使用 load_only,因为
我是一名优秀的程序员,十分优秀!