Python 如果要查询Alchemy,请指定列名

Python 如果要查询Alchemy,请指定列名,python,sqlalchemy,flask-sqlalchemy,Python,Sqlalchemy,Flask Sqlalchemy,如何使用模型在查询中指定所需的列(默认情况下选择所有列)?我知道如何使用sqlalchmey会话执行此操作:session.query(self.col1),但如何使用模型执行此操作?我不能做SomeModel.query()。有办法吗 session.query().with_entities(SomeModel.col1) 与 session.query(SomeModel.col1) 对于alias,我们可以使用.label() 这里举一个例子: movies = Movie.quer

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

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

session.query(SomeModel.col1)
对于alias,我们可以使用.label()

这里举一个例子:

movies = Movie.query.filter(Movie.rating != 0).order_by(desc(Movie.rating)).all()
我在db中查询分级为0的电影,然后首先按最高分级排序


看看这里:

您可以使用
Model.query
,因为
模型(或者通常是它的基类,特别是在使用声明性扩展的情况下)是赋值的。在这种情况下,
Model.query
相当于
Session.query(Model)

我不知道如何修改查询返回的列(使用添加更多列除外)。

因此,您最好使用
Session.query(Model.col1,Model.col2,…)
(如Salil所示)。

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

根据您的需求,您可能也会发现它很有用。它们允许您返回完整的对象,但限制通过导线的列。

您可以使用函数:

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\u 1',),('value\u 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))

with_entities()使all()产生列值的元组,而不是对象!科莱普托:只要你要求它让步,它就会让步。SomeModel.query.with_实体(SomeModel)将生成对象。就像session.query(SomeModel.col1、SomeModel.col2)会生成列值的元组一样。如果您不想让列通过连接,但您还是想要整个对象,那么可以使用延迟。谢谢,它很有效。但我们如何为字段分配别名呢?因为在我的例子中,我使用了两个表中都存在的连接和冲突
ID
字段是的,我对@MitulShah有相同的问题,如何设置别名?对于别名,请查看下面的简短回答。使用
.label()
第二个选项听起来更符合逻辑,而且更短-win/win您的第一个语句是错误的。你需要括号。因此,它应该是:
session.query()。对于_entities(SomeModel.col1)
到目前为止,如果您想重用现有的查询对象,特别是在执行多个复杂子查询的情况下,第一个(和第三个)选项是最好的。我相信也有一种方法可以通过查询值的列列表()来实现这一点,-但是列表的语法糖分我现在还不知道。这个解决方案是最好的,因为它仍然是一个对象,而不仅仅是结果列表。这个解决方案让我很荣幸。它有许多优点:-返回与
完全相同类型的对象。first()
一个()
(这将延迟/急切地加载字段和关系),-可以设置为查询组件代码是干净的,但sql查询会从数据库中选择所有字段。我在接受的答案中使用了
与_entities
,并且查询只选择了字段/。这将返回整个对象。这不起作用,将返回整个对象。
 ['value_1', 'value_2']
fields = ["col1", "col2", ...]\
session.query(map(lambda x: getattr(SomeModel.c, x), fields))