如何在@hybrid_property的expression中添加多表case语句
问题原因
你在@date_time_hybrid.expression装饰的类级表达式方法中,直接通过关系属性cls.tbl_child_rel访问子表字段date_time是非法操作。关系属性在SQL表达式上下文中不会自动完成表关联映射,本身也不携带子表的字段属性,因此抛出了属性不存在的异常。
修复方案
需要分别补全实例级的hybrid_property逻辑,同时将表达式级逻辑改为通过关联子查询获取子表字段值,修改后的核心代码如下:
首先新增必要导入:
from sqlalchemy import func, select
修改TblParent类中的hybrid_property定义:
class TblParent(Base): __tablename__ = "tbl_parent" __table_args__ = {"schema": "test"} id_ = Column(Integer, primary_key=True) date_time = Column(DateTime) tbl_child_rel = relationship("TblChild", back_populates="tbl_parent_rel", uselist=False) @hybrid_property def date_time_hybrid(self): # 实例层面逻辑:直接判断关联对象是否存在 if self.tbl_child_rel: return self.tbl_child_rel.date_time return self.date_time @date_time_hybrid.expression def date_time_hybrid(cls): # 表达式层面逻辑:通过关联子查询取对应子表的时间值 child_dt_subq = ( select(TblChild.date_time) .where(TblChild.tbl_parent_id == cls.id_) .scalar_subquery() ) # coalesce会返回第一个非空值,替代case简化逻辑 return func.coalesce(child_dt_subq, cls.date_time)
验证效果
修改后执行session.query(TblParent.date_time_hybrid).all()即可正常返回结果:关联了子表的父记录返回子表的datetime值,未关联子表的父记录返回自身的datetime值。
内容的提问来源于stack exchange,提问作者Jossy
相关产品推荐
相关产品推荐

