Python SQLAlchemy使用标记的OVER子句和ORM进行查询

时间:2014-12-16 17:25:12

标签: python sqlalchemy

另一个问题是如何在sqlalchemy上使用OVER子句:

Using the OVER window function in SQLAlchemy

但是如何使用ORM呢?我有类似的东西:

q = self.session.query(self.entity, func.count().over().label('count_over'))

当我使用以下消息呼叫q.all()时失败:

sqlalchemy.exc.InvalidRequestError:
Ambiguous column name 'count(*) OVER ()' in result set! try 'use_labels' option on select statement

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:4)

您的over语法几乎正确,它应该是这样的:

import sqlalchemy
q = self.session.query(
    self.entity,
    sqlalchemy.over(func.count()).label('count_over'),
)

文档示例:

from sqlalchemy import over
over(func.row_number(), order_by='x')

答案 1 :(得分:2)

SQLAlchemy Query对象具有with_entities方法,可用于自定义查询返回的列列表:

Model.query.with_entities(Model.foo, func.count().over().label('count_over'))

导致以下SQL:

SELECT models.foo AS models_foo, count(*) OVER () AS count_over FROM models

答案 2 :(得分:0)

您正确使用了功能。他们使用它们来产生期望结果的方式如下:

from sqlalchemy import func
q = self.session.query(self.entity, func.count(self.entity).over().label('count_over'))

由于未指定COUNT(*),因此将产生一条Entity.field语句。我使用以下格式:

from myschema import MyEntity
from sqlalchemy import func
q = self.session.query(MyEntity, func.count(MyEntity.id).over().label('count'))

那当然是一个id字段。但是,您会掌握一些技巧:-)