昨天我询问了一个复杂的(对我而言)MySQL 查询,我需要将其用作column_property. 一位善良的用户(他不使用 SQLAlchemy,所以我懒得链接他)回答了其中的 SQL 部分:
select *
from (
select t.*,
case when count(*) over(partition by firstname, lastname) > 1
then row_number() over(partition by firstname, lastname order by startdate)
end as identifier
from person t
) t
where id = ?
Run Code Online (Sandbox Code Playgroud)
经过长时间的努力,我能够将其转换为 SQLA 中的函数:
def get_identifier(id):
mycase = db.case([
(
db.func.count().over(partition_by=[Person.firstname, Person.lastname]) > 1,
db.func.row_number().over(partition_by=[Person.firstname, Person.lastname], order_by=Person.startdate)
)
]).label('identifier')
subq = db.session.query(Person.id, mycase).subquery('subq')
identifier = db.session.query(subq.c.identifier).\
filter(subq.c.id == id).scalar()
return identifier
Run Code Online (Sandbox Code Playgroud)
然而,我一直困惑于如何使这项工作成为一个column_property,而且我能找到的例子并不多。即使是简单的部分——如果我在Person课堂上,那么我就无法访问 …