Flask SQLAlchemy query, specify column names
如何使用模型在查询中指定所需的列(默认情况下会选择所有列)? 我知道如何使用sqlalchmey会话:session.query(self.col1),但是如何使用模型呢? 我不能做SomeModel.query()。 有办法吗?
您可以使用with_entities()方法来限制要在结果中返回的列。 (文档)
1
| result = SomeModel.query.with_entities(SomeModel.col1, SomeModel.col2) |
根据您的要求,您可能还会发现递延有用。它们使您可以返回完整的对象,但可以限制导线上的列。
-
with_entities()使all()产生列值的元组,而不是对象!
-
kolypto:它会产生您要求的任何结果。 SomeModel.query.with_entities(SomeModel)将产生对象。就像session.query(SomeModel.col1,SomeModel.col2)会产生列值的元组。如果您不希望列越过导线,但是无论如何您想要整个对象,则使用Deferreds。
-
谢谢工作。但是,我们如何为该字段分配别名?因为就我而言,我使用的是JOIN和两个表中都存在的冲突ID字段
-
是的,我对@MitulShah有相同的问题,如何设置别名?
-
对于别名,请在下面查看此简短答案,即。使用.label() stackoverflow.com/a/11535992/248616
1
| session.query().with_entities(SomeModel.col1) |
是相同的
1
| session.query(SomeModel.col1) |
对于别名,我们可以使用.label()
1
| session.query(SomeModel.col1.label('some alias name')) |
-
第二个听起来更合逻辑且更短-双赢
-
您的第一句话是错误的。您需要括号。因此,它应显示为:session.query().with_entities(SomeModel.col1)
您可以使用load_only函数:
1 2 3 4
| 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)。
我不知道修改查询返回的列的方法(除非使用add_columns()添加更多列)。
因此,最好的选择是使用Session.query(Model.col1, Model.col2, ...)(如Salil所示)。
-
我相信docs.sqlalchemy.org/en/latest/orm/也可以使用查询values()的列列表来完成此操作-但此刻我不知道该列表的语法。
这里的一个例子:
1
| movies = Movie.query.filter(Movie.rating != 0).order_by(desc(Movie.rating)).all() |
我在数据库中查询评级为<> 0的电影,然后我首先以最高评级对它们进行评级。
在这里看看:在Flask-SQLAlchemy中选择,插入,删除