Flask SQLAlchemy 查询,指定列名
- 2025-03-07 09:04:00
- admin 原创
- 52
问题描述:
如何使用模型指定查询中所需的列(默认情况下会选择所有列)?我知道如何使用 sqlalchmey session: 执行此操作session.query(self.col1)
,但如何使用模型执行此操作?我不会SomeModel.query()
。有办法吗?
解决方案 1:
您可以使用该with_entities()
方法来限制您想要在结果中返回的列。(文档)
result = SomeModel.query.with_entities(SomeModel.col1, SomeModel.col2)
根据您的需求,您可能还会发现deferred很有用。它们允许您返回完整对象,但会限制通过网络传输的列。
解决方案 2:
session.query().with_entities(SomeModel.col1)
等同于
session.query(SomeModel.col1)
对于别名,我们可以使用 .label()
session.query(SomeModel.col1.label('some alias name'))
解决方案 3:
您可以使用load_only函数:
from sqlalchemy.orm import load_only
fields = ['name', 'addr', 'phone', 'url']
companies = session.query(SomeModel).options(load_only(*fields)).all()
解决方案 4:
您可以使用Model.query
,因为Model
(或通常是其基类,尤其是在使用声明性扩展的情况下)被分配Sesssion.query_property
。在这种情况下,Model.query
相当于Session.query(Model)
。
我不知道如何修改查询返回的列(除非使用 添加更多add_columns()
)。
因此,最好的办法是使用Session.query(Model.col1, Model.col2, ...)
(正如 Salil 所示)。
解决方案 5:
您可以使用 Query.values、Query.values
session.query(SomeModel).values('id', 'user')
解决方案 6:
我通常使用这个片段:
fields = ["col1", "col2", ...]\nsession.query(map(lambda x: getattr(SomeModel.c, x), fields))
解决方案 7:
result = ModalName.query.add_columns(ModelName.colname, ModelName.colname)
解决方案 8:
返回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']
解决方案 9:
获取具有特定列的实体的另一种语法:
any_query.with_entities(Entity).options(load_only(Entity.col))
扫码咨询,免费领取项目管理大礼包!