我想将行号作为查询列。由于我使用的是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
进行文字加入。
有什么建议吗?
修改
目前,我正在循环查询分页查询的结果,并将计算出的数字从当前页面分配给每一行。
答案 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开始,因为它是预先递增的。