Flask SQLAlchemy查询,指定列名

时间:2012-07-17 20:16:38

标签: python sqlalchemy flask-sqlalchemy

如何使用模型在查询中指定我想要的列(默认选择所有列)?我知道如何使用sqlalchmey会话执行此操作:session.query(self.col1),但如何使用模型进行此操作?我做不到SomeModel.query()。有办法吗?

9 个答案:

答案 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,然后我按照最高等级评级排序。

看看这里:Select, Insert, Delete in Flask-SQLAlchemy