如何从 sqlalchemy 中的标签对象获取表数据?

问题描述 投票:0回答:1

假设我有以下简化示例:

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 。我在这里做什么?

python sqlalchemy
1个回答
0
投票

为此,我们需要通过标签元素的

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)
© www.soinside.com 2019 - 2024. All rights reserved.