如何使用模型指定查询中所需的列(默认情况下选择所有列)?我知道如何使用SQLAlchmey会话:session.query(self.col1)来执行此操作,但如何使用模型来执行此操作呢?我不能做SomeModel.query()。有办法吗?
session.query(self.col1)
SomeModel.query()
session.query().with_entities(SomeModel.col1)
与.相同
session.query(SomeModel.col1)
对于别名,我们可以使用.label()
session.query(SomeModel.col1.label('some alias name'))
您可以使用Model.query,因为Model(或者通常是它的基类,特别是在使用声明性扩展的情况下)被分配Sesssion.query_property。在这种情况下,Model.query等于Session.query(Model)。
Model.query
Model
Sesssion.query_property
Session.query(Model)
我不知道如何修改查询返回的列(除了使用add_columns()添加更多列)。 因此,最好的办法是使用Session.query(Model.col1, Model.col2, ...)(如Salil所示)。
add_columns()
Session.query(Model.col1, Model.col2, ...)
您可以使用with_entities()方法来限制要在结果中返回的列。(文档)
with_entities()
result = SomeModel.query.with_entities(SomeModel.col1, SomeModel.col2)
根据您的要求,您可能还会发现延期非常有用。它们允许您返回完整的对象,但限制通过网络传输的列。
您可以使用仅加载_函数:
from sqlalchemy.orm import load_only fields = ['name', 'addr', 'phone', 'url'] companies = session.query(SomeModel).options(load_only(*fields)).all()
您可以使用query.values,查询.值
session.query(SomeModel).values('id', 'user')
作为session.query(SomeModel.col1)返回如下所示的元组数组[('value_1',),('value_2',)]如果要将结果强制转换为普通阵列,可以使用以下语句之一执行此操作:
[('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']
我通常使用这个片段:
fields = ["col1", "col2", ...]\ session.query(map(lambda x: getattr(SomeModel.c, x), fields))
result = ModalName.query.add_columns(ModelName.colname, ModelName.colname)
获取具有特定列的实体的备用语法:
any_query.with_entities(Entity).options(load_only(Entity.col))