Python 如果要查询Alchemy,请指定列名
如何使用模型在查询中指定所需的列(默认情况下选择所有列)?我知道如何使用sqlalchmey会话执行此操作: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
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))