假设我有以下简化示例:
from sqlalchemy.orm import DeclarativeBase, Mapped
class TableA(DeclarativeBase):
col_name = Mapped[str | None]
parent_id = Mapped[int]
class TableB(DeclarativeBase):
col_name = Mapped[str | None]
parent_id = Mapped[int]
class TableC(DeclarativeBase):
col_name = Mapped[str | None]
parent_id = Mapped[int]
MY_MAPPINGS = {
"a__col_name" : func.coalesce(TableA.col_name, "").label("some_col_name"),
"b__col_name" : func.coalesce(TableB.col_name, "").label("another__col_name"),
"c__col_name" : func.coalesce(TableC.col_name, "").label("third__col_name"),
}
def get_query(mapping: str, parent_id: int):
col = MY_MAPPINGS[mapping]
return select(col)
那应该没问题。但是现在如果我想在这个查询上添加一个针对parent_id 的过滤器,我该怎么做呢?理想情况下我想做类似的事情
.filter(col.table.parent_id = parent_id)
但是 col 是类型
sqlalchemy.sql.elements.Label
并且 col.table 是 None 。我在这里做什么?
为此,我们需要通过标签元素的
clauses
属性访问原始列。
clauses
列出了组成已标记的函数对象的部分,在这种情况下,第一个这样的部分是原始列。请注意,过滤器属性必须通过表的 c
或 columns
对象访问,而不是像 ORM 实体属性那样直接访问。
col = sa.func.coalesce(MyModel.spam, '').label('eggs')
table = next(iter(col.element.clauses)).table
q = sa.select(col).where(table.c.parent_id)