【发布时间】:2012-07-16 19:53:27
【问题描述】:
如何使用模型在查询中指定我想要的列(默认选择所有列)?我知道如何使用 sqlalchmey 会话来做到这一点:session.query(self.col1),但是如何使用模型来做到这一点?我做不到SomeModel.query()。有什么办法吗?
【问题讨论】:
标签: python sqlalchemy flask-sqlalchemy
如何使用模型在查询中指定我想要的列(默认选择所有列)?我知道如何使用 sqlalchmey 会话来做到这一点:session.query(self.col1),但是如何使用模型来做到这一点?我做不到SomeModel.query()。有什么办法吗?
【问题讨论】:
标签: python sqlalchemy flask-sqlalchemy
您可以使用with_entities() 方法来限制您希望在结果中返回哪些列。 (documentation)
result = SomeModel.query.with_entities(SomeModel.col1, SomeModel.col2)
根据您的要求,您可能还会发现deferreds 很有用。它们允许您返回完整的对象,但限制通过网络传输的列。
【讨论】:
ID 两个表中都存在的字段
.label()stackoverflow.com/a/11535992/248616
session.query().with_entities(SomeModel.col1)
和
一样session.query(SomeModel.col1)
对于别名,我们可以使用 .label()
session.query(SomeModel.col1.label('some alias name'))
【讨论】:
你可以使用load_only函数:
from sqlalchemy.orm import load_only
fields = ['name', 'addr', 'phone', 'url']
companies = session.query(SomeModel).options(load_only(*fields)).all()
【讨论】:
.first() 和.one() 完全相同类型的对象(这将延迟/急切加载字段和关系), - 可以设置为查询组件
with_entities,并且查询仅选择了该字段/。
您可以使用Model.query,因为Model(或者通常是它的基类,尤其是在使用声明性扩展的情况下)被分配了Sesssion.query_property。在这种情况下,Model.query 等同于 Session.query(Model)。
我不知道修改查询返回的列的方法(使用add_columns() 添加更多列除外)。
所以最好的办法是使用Session.query(Model.col1, Model.col2, ...)(如 Salil 所示)。
【讨论】:
您可以使用 Query.values,Query.values
session.query(SomeModel).values('id', 'user')
【讨论】:
我一般用这个sn-p:
fields = ["col1", "col2", ...]\
session.query(map(lambda x: getattr(SomeModel.c, x), fields))
【讨论】:
add_columns;不确定缺少什么,但这个想法很好。
result = ModalName.query.add_columns(ModelName.colname, ModelName.colname)
【讨论】:
由于session.query(SomeModel.col1) 返回一个像[('value_1',),('value_2',)] 这样的元组数组,如果您想将结果转换为普通数组,您可以使用以下语句之一来实现:
values = [value[0] for value in session.query(SomeModel.col1)]
values = [model.col1 for model in session.query(SomeModel).options(load_only('col1'))]
结果:
['value_1', 'value_2']
【讨论】:
这里有一个例子:
movies = Movie.query.filter(Movie.rating != 0).order_by(desc(Movie.rating)).all()
我在数据库中查询评分 0 的电影,然后按评分最高的顺序对它们进行排序。
【讨论】: