也可以使用子查询来实现:
sub_query = session.query(
Foo,
func.row_number().over(partition_by=Foo.foo_field, order_by=desc(Foo.foo_date_time)).label("row_number")
)
sub_query = sub_query.filter(Foo.time_key <= time_key).subquery()
query = session.query(sub_query).filter(sub_query.c.row_number == 1)
它基本上生成一个相当于将 row_number 作为列添加的 SQL 语句。
编译该语句。
sub_query = session.query(
Foo,
func.row_number().over(partition_by=Foo.foo_field, order_by=desc(Foo.foo_date_time)).label("row_number")
)
sub_query = sub_query.filter(Foo.time_key <= time_key).subquery()
query = session.query(sub_query).filter(sub_query.c.row_number == 1)
str(query.statement.compile())
将生成以下内容:
SELECT anon_1.time_key,
anon_1.foo_field,
anon_1.foo_date_time,
anon_1.row_number
FROM (
SELECT foo.time_key AS time_key,
foo.foo_field AS foo_field,
foo.foo_date_time AS foo_date_time,
row_number() OVER (PARTITION BY foo.foo_field ORDER BY foo.foo_date_time DESC) AS row_number
FROM foo
WHERE foo.time_key <= %(time_key_1)s
) AS anon_1
WHERE anon_1.row_number = %(row_number_1)s
更新: 请注意,自SQLAlchemy 1.4起,
Query.from_self方法已被弃用,并将在2.0中删除,
根据官方文档
如果有人正在使用该方法,请查阅迁移指南
subquery()
会导致模型类丢失,并且以元组形式返回一行数据。有没有办法让它保留其类型?例如,在运行query.all()
之后仍然是Foo
类型? - undefined