Python SQLAlchemy Query使用带有ORM的标记OVER子句



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

在 SQLAlchemy 中使用 OVER 窗口函数

但是如何使用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

我该如何解决这个问题?

你的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')

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

你做对了函数。他们使用它们来产生所需结果的方法如下:

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字段。但是你明白了机制:-(

最新更新