将查询转换为column_property?

use*_*182 5 python sqlalchemy

昨天我询问了一个复杂的(对我而言)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课堂上,那么我就无法访问Person.firstname等等——也会令人困惑。更复杂的是,实际查询(上面已简化)使用了一个复杂的 order_by 子句,该子句本身是从 Person 中的另一个 column_property 生成的;该条款实际上看起来像order_by=[*Person.person_order]

如果column_property不正确,是否有其他方法可以将此函数作为额外列附加,或在Person对象中附加任何等效项(例如可以调用的方法)?