如何使用模型在查询中指定我想要的列(默认选择所有列)?我知道如何使用 sqlalchmey session: 来做到这一点session.query(self.col1)
,但是如何使用模型来做到这一点?我做不到SomeModel.query()
。有办法吗?
9 回答
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()
您可以使用Model.query
, 因为Model
(或通常是它的基类,尤其是在使用声明性扩展的情况下)已分配Sesssion.query_property
。在这种情况下Model.query
相当于Session.query(Model)
。
我不知道修改查询返回的列的方法(除了添加更多 using add_columns()
)。
所以你最好的办法是使用Session.query(Model.col1, Model.col2, ...)
(如 Salil 所示)。
您可以使用 Query.values、Query.values
session.query(SomeModel).values('id', 'user')
我通常使用这个片段:
fields = ["col1", "col2", ...]\
session.query(map(lambda x: getattr(SomeModel.c, x), fields))
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 的电影,然后我首先通过评分最高的评分对它们进行排序。