python - 如何将行号列添加到 SqlAlchemy 查询?

标签 python mysql sqlalchemy

我想将行号作为查询的一列。由于我使用的是MySql,所以我无法使用SqlAlchemy 内置的func.row_number()。此查询的结果将被分页,因此我想在拆分发生之前保留行号。

session.query(MyModel.id, MyModel.date, "row_number")

我尝试使用 hybrid_property 来增加我在查询之前重置的 MyModel 类中的静态变量,但它没有用。

@hybrid_property
def row_number(self):
    cls = self.__class__
    cls.row_index = cls.row_index + 1
    return literal(self.row_index)

@row_number.expression
def row_number(cls):
    cls.row_index = cls.row_index + 1
    return literal(cls.row_index)

我还尝试将子查询与此 solution 混合使用:

 session.query(myquery.subquery(), literal("@rownum := @rownum + 1 AS row_number"))

但我没有找到为 (SELECT @rownum := 0) r 进行文本连接的方法。

有什么建议吗?

编辑

目前,我循环处理分页查询的结果,并将当前页面的计算数字分配给每一行。

最佳答案

SQLAlchemy 允许您在某些地方使用 text(),但不能随意使用。我尤其找不到在列或连接中使用它的简单/记录方式。但是,您可以用 SQL 编写整个查询并仍然从中获取 ORM 对象。示例:

query = session.query(Foobar, "rownum")
query = query.from_statement(
    "select foobar.*, cast(@row := @row + 1 as unsigned) as rownum"
    " from foobar, (select @row := 0) as init"
    )

话虽这么说,我也没有真正看到像 enumerate(query.all()) 这样的问题。请注意,如果您使用 LIMIT 表达式,您从 MySQL 获得的行号将用于最终结果,并且仍然需要添加页面起始索引。也就是说,默认情况下它不是“拆分前”。如果你想在 MySQL 中为你添加起始行,你可以这样做:

prevrow = 42
query = session.query(Foobar, "rownum")
query = query.from_statement(sqlalchemy.text(
    "select foobar.*, cast(@row := @row + 1 as unsigned) as rownum"
    " from foobar, (select @row := :prevrow) as init"
    ).bindparams(prevrow=prevrow))

在这种情况下,数字将从 43 开始,因为它是预递增的。

关于python - 如何将行号列添加到 SqlAlchemy 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25299231/

相关文章:

python - SQLAlchemy 查询,其中列是另一个字符串的子字符串

python - 如何使用 SQLAlchemy 和 session 进行更新?

python - 如何在pyspark数据框中转换 "DD/MM/YYYY"格式的日期?

python - 基于项目和 ID 两列的 SUM

python - 使用正则表达式重命名 Pandas 数据框中的列

mysql - 使用 diff 唯一字段进行选择

php - 从 mysql 过渡到 MySQLi 或 PDO

Python3.3 : Square-root optimization

php - mysql_fetch_array 返回一个数组,其值为数字索引,但对应的关联索引为空

python - Pylons 1.0 AttributeError : 'module' object has no attribute 'metadata'