Flask SQLAlchemy查询,指定列名


125

如何使用模型在查询中指定所需的列(默认情况下会选择所有列)?我知道如何使用sqlalchmey会话:session.query(self.col1),但是如何使用模型呢?我做不到SomeModel.query()。有办法吗?

Answers:


220

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

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

根据您的要求,您可能还会发现递延有用。它们使您可以返回完整的对象,但可以限制导线上的列。


21
with_entities()使all()产生列值的元组,而不是对象!
kolypto 2014年

10
kolypto:它会产生您要求的任何结果。SomeModel.query.with_entities(SomeModel)将产生对象。就像session.query(SomeModel.col1,SomeModel.col2)会产生列值的元组。如果您不希望列越过导线,但无论如何您想要整个对象,则使用递延。
David McKeone 2014年

2
谢谢工作。但是,我们如何为该字段分配别名?因为就我而言,我正在使用ID两个表中都存在的JOIN和冲突字段
Mitul Shah 2015年

是的,我对@MitulShah有相同的问题,如何设置别名?
Nam G VU

对于别名,请在下面查看此简短答案,即。使用.label() stackoverflow.com/a/11535992/248616
Nam G VU

69
session.query().with_entities(SomeModel.col1)

是相同的

session.query(SomeModel.col1)

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

session.query(SomeModel.col1.label('some alias name'))

2
第二个听起来更合逻辑且更短-双赢
fgblomqvist

7
您的第一句话是错误的。您需要括号。因此,其内容应为:session.query().with_entities(SomeModel.col1)
JGFMK,

如果要重用现有的查询对象,尤其是在执行多个复杂子查询的情况下,第一个(和第三个)选项是最好的。
Jamie Strauss

36

您可以使用load_only函数:

from sqlalchemy.orm import load_only

fields = ['name', 'addr', 'phone', 'url']
companies = session.query(SomeModel).options(load_only(*fields)).all()

1
该解决方案是最好的解决方案,因为它不仅可以作为结果列表,而且仍然可以作为对象使用。
rborodinov

对于这个解决方案,您感到很荣幸。它具有许多优点:-返回与.first()和完全相同类型的对象.one()(将懒惰/贪婪加载领域和关系), -可以设置为查询组件
达明

代码是干净的,但是sql查询从数据库中选择所有字段。我已经with_entities按照接受的答案中的说明使用了查询,查询只选择了该字段/。
Srikanth Jeeva

11

您可以使用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()的列列表来实现此目的 -但此刻的语法语法使我眼前一亮
-JGFMK,


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.