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

时间:2014-08-14 02:46:26

标签: 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进行文字加入。

有什么建议吗?

修改

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

1 个答案:

答案 0 :(得分:4)

SQLAlchemy允许您在某些地方使用text(),但不能随意使用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" ) 。我特别找不到在列或连接中使用它的简单/记录方式。但是,您可以在SQL中编写整个查询,但仍然可以从中获取ORM对象。例如:

enumerate(query.all())

话虽如此,我也没有看到像LIMIT这样的问题。请注意,如果使用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)) 表达式,则从MySQL获取的行号将用于最终结果,并且仍需要添加页面起始索引。也就是说,默认情况下它不是“分裂前”。如果你想在MySQL中为你添加起始行,你可以这样做:

{{1}}

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