Flask SQLAlchemy查询,指定列名

Mat*_*agg 98 python sqlalchemy flask-sqlalchemy

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

Dav*_*one 185

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

result = SomeModel.query.with_entities(SomeModel.col1, SomeModel.col2)
Run Code Online (Sandbox Code Playgroud)

根据您的要求,您还可以找到有用的延迟.它们允许您返回完整对象,但限制来自电线的列.

  • with_entities()使all()产生列值的元组,而不是对象! (17认同)
  • kolypto:它产生你要求它产生的任何东西.SomeModel.query.with_entities(SomeModel)将生成该对象.就像session.query(SomeModel.col1,SomeModel.col2)会产生列值的元组一样.如果您不希望列通过电线,但您仍然想要整个对象,那么延迟就是您所使用的. (10认同)
  • 谢谢工作。但是,我们如何为该字段分配别名?因为就我而言,我正在使用JOIN和两个表中都存在的冲突ID字段 (2认同)
  • 顺便说一句:在最近的版本中,“with_entities”生成“Row”实例。 (2认同)

Sal*_*lil 55

session.query().with_entities(SomeModel.col1)
Run Code Online (Sandbox Code Playgroud)

是相同的

session.query(SomeModel.col1)
Run Code Online (Sandbox Code Playgroud)

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

session.query(SomeModel.col1.label('some alias name'))
Run Code Online (Sandbox Code Playgroud)

  • 你的第一个陈述是错误的.你需要括号.因此,它应该是:`session.query().with_entities(SomeModel.col1)` (7认同)
  • 第二个听起来更合乎逻辑,更短 - 赢/赢 (2认同)

Vla*_*den 24

你可以使用load_only函数:

from sqlalchemy.orm import load_only

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

'公司'是你的模型(在你的情况下是SomeModel)

  • 该解决方案是最好的解决方案,因为它仍然作为对象工作,而不仅仅是结果列表。 (2认同)
  • 这将返回整个对象。 (2认同)

van*_*van 10

您可以使用Model.query,因为Model(或通常是其基类,特别是在使用声明性扩展的情况下)被分配Sesssion.query_property.在这种情况下,Model.query相当于Session.query(Model).

我不知道修改查询返回的列的方法(除了添加更多使用add_columns()).
所以你最好的拍摄是使用Session.query(Model.col1, Model.col2, ...)(如Salil所示).


gao*_*idf 5

您可以使用 Query.values、Query.values

session.query(SomeModel).values('id', 'user')