177

如何使用模型在查询中指定我想要的列(默认选择所有列)?我知道如何使用 sqlalchmey session: 来做到这一点session.query(self.col1),但是如何使用模型来做到这一点?我做不到SomeModel.query()。有办法吗?

4

9 回答 9

289

您可以使用该with_entities()方法来限制要在结果中返回的列。(文档

result = SomeModel.query.with_entities(SomeModel.col1, SomeModel.col2)

根据您的要求,您可能还会发现延迟有用。它们允许您返回完整的对象,但限制通过网络传输的列。

于 2012-08-21T12:29:42.310 回答
91
session.query().with_entities(SomeModel.col1)

是相同的

session.query(SomeModel.col1)

对于别名,我们可以使用 .label()

session.query(SomeModel.col1.label('some alias name'))
于 2012-07-18T07:07:28.913 回答
66

您可以使用load_only功能:

from sqlalchemy.orm import load_only

fields = ['name', 'addr', 'phone', 'url']
companies = session.query(SomeModel).options(load_only(*fields)).all()
于 2017-08-27T13:55:04.110 回答
11

您可以使用Model.query, 因为Model(或通常是它的基类,尤其是在使用声明性扩展的情况下)已分配Sesssion.query_property。在这种情况下Model.query相当于Session.query(Model)

我不知道修改查询返回的列的方法(除了添加更多 using add_columns())。
所以你最好的办法是使用Session.query(Model.col1, Model.col2, ...)(如 Salil 所示)。

于 2012-07-19T08:54:29.113 回答
5

您可以使用 Query.values、Query.values

session.query(SomeModel).values('id', 'user')

于 2019-10-15T07:47:10.540 回答
2

我通常使用这个片段:

fields = ["col1", "col2", ...]\
session.query(map(lambda x: getattr(SomeModel.c, x), fields))
于 2021-04-29T10:34:56.777 回答
2

result = ModalName.query.add_columns(ModelName.colname, ModelName.colname)

于 2021-06-21T08:03:56.257 回答
0

如果您想将结果转换为普通数组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']
于 2021-01-06T18:05:44.293 回答
-15

这里有一个例子:

movies = Movie.query.filter(Movie.rating != 0).order_by(desc(Movie.rating)).all()

我在数据库中查询评分 <> 0 的电影,然后我首先通过评分最高的评分对它们进行排序。

看这里:在 Flask-SQLAlchemy 中选择、插入、删除

于 2012-07-18T09:43:09.450 回答