如何使用模型在查询中指定我想要的列(默认选择所有列)?我知道如何使用sqlalchmey会话执行此操作:session.query(self.col1)
,但如何使用模型进行此操作?我做不到SomeModel.query()
。有办法吗?
答案 0 :(得分:162)
您可以使用with_entities()
方法来限制您希望在结果中返回哪些列。 (documentation)
result = SomeModel.query.with_entities(SomeModel.col1, SomeModel.col2)
根据您的要求,您可能会发现deferreds有用。它们允许您返回完整的对象,但限制通过电线的列。
答案 1 :(得分:47)
session.query.with_entities(SomeModel.col1)
与
相同session.query(SomeModel.col1)
对于别名,我们可以使用.label()
session.query(SomeModel.col1.label('some alias name'))
答案 2 :(得分:21)
您可以使用load_only功能:
from sqlalchemy.orm import load_only
fields = ['name', 'addr', 'phone', 'url']
companies = session.query(Company).options(load_only(*fields)).all()
其中'公司'是你的模型(在你的情况下是它的SomeModel)
答案 3 :(得分:10)
您可以使用Model.query
,因为Model
(或通常是其基类,特别是在使用声明性扩展的情况下)被指定为Sesssion.query_property
。在这种情况下,Model.query
相当于Session.query(Model)
。
我不知道修改查询返回的列的方法(除了使用add_columns()
添加更多列)。
因此,最好的方法是使用Session.query(Model.col1, Model.col2, ...)
(如Salil所示)。
答案 4 :(得分:1)
您可以使用Query.values,Query.values
session.query(SomeModel).values('id', 'user')
答案 5 :(得分:1)
result = ModalName.query.add_columns(ModelName.colname, ModelName.colname)
答案 6 :(得分: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']
答案 7 :(得分:0)
我通常使用这个片段:
fields = ["col1", "col2", ...]\
session.query(map(lambda x: getattr(SomeModel.c, x), fields))
答案 8 :(得分:-6)
这里有一个例子:
movies = Movie.query.filter(Movie.rating != 0).order_by(desc(Movie.rating)).all()
我在数据库中查询评级为<>的电影0,然后我按照最高等级评级排序。