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_property
s 没有在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 中定义的字段/列