昨天我询问了一个复杂的(对我而言)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对象中附加任何等效项(例如可以调用的方法)?