SqlAlchemy ORM - 在查询时限制列(选择) - column_property

Posted

技术标签:

【中文标题】SqlAlchemy ORM - 在查询时限制列(选择) - column_property【英文标题】:SqlAlchemy ORM - restricting columns at query time (select) - column_property 【发布时间】:2012-07-08 08:01:33 【问题描述】:

我知道我可以从表中延迟加载列:

session.query(MyTable).options(defer(colname) 
      for colname in ['col4', 'col5', ..,  'colN'])

我只想要前 3 列,因此可以将其缩短为以下内容:

session.query(MyTable).options(defer(col.name) 
      for col.name in MyTable.__table__.columns
      if col.name not in ['col1', 'col2', 'col3'])

因为MyTable 有一些额外的column_propertys 没有在MyTable.__table__.columns 中列出,所以即使我不想要它们,它们也会包含在查询中。

那么有没有一种结构可以直接表达我想要的限制? 例如像

session.query(MyTable).options(XXselect('col1', 'col2', 'col3'))

【问题讨论】:

在这个类似的线程中有一个使用 defer_everything_but() 的建议:***.com/questions/6977658/…。我偶然发现了这个问题,因为我想关注一个需要完整对象的关系。但我不想选择所有列(例如,如果用户没有对所有列的读取权限)。我不知道有任何其他方法可以仅从 keyedtuple 跟踪关系, 【参考方案1】:

如果你只想要这些值,你可以打电话:

session.query(Mytable.col1, MyTable.col2, MyTable.col3).

如果您想要带有延迟列的完整对象,MyTable.__table__.columns 应该为您提供所有列,而不管 mixins 是什么。

【讨论】:

抱歉,您说 MyTable.__table__.columns 包含 mixins 是正确的......事实上,由于 column_property,查询中出现了额外的列。我已经更新了我的答案以反映这一点。 很抱歉,我想我无法为您提供帮助。我唯一的另一个想法是在每一列上使用deferred,但这听起来不是一个好主意。此外,也许使用 column_property 添加您的表定义可能会有所帮助(据我所知,有不同的使用方法)。【参考方案2】:

load_only() 函数可用于此

可以选择任意一组列作为“仅加载”列,这些列将在延迟给定实体上的所有其他列的同时加载,使用 orm.load_only():

from sqlalchemy.orm import load_only

session.query(Book).options(load_only("summary", "excerpt"))

【讨论】:

以上是关于SqlAlchemy ORM - 在查询时限制列(选择) - column_property的主要内容,如果未能解决你的问题,请参考以下文章

将 SQL 查询限制为 Graphene-SQLAlchemy 中定义的字段/列

SQLAlchemy 仅从连接表中选择列

SQLAlchemy ORM如何将查询与表连接起来

SQLAlchemy ORM:修改查询返回的列

加载关系时如何指示SQLAlchemy ORM并行执行多个查询?

SQLAlchemy 将外连接 ORM 查询转换为 Core