SQLAlchemy - 查询仅具有基于表达式的实体

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

当尝试从表中选择特定列同时检索关系时,我收到此 SQLAlchemy 错误。我也在使用异步会话。

sqlalchemy.exc.ArgumentError: Query has only expression-based entities; attribute loader options for Mapper[ModelA(modela)] can't be applied here.

这是有问题的查询:

async def get(self, fields):
        # parse_fields gets the column and relationship of a SQLAlchemy table model, i.e ModelA.id or ModelA.my_relationship
        columns, relationships = self.parse_fields(fields, ModelA)
        stmnt = select(*columns)
        if len(relationships):
            stmnt = stmnt.options(selectinload(*relationships))
        result = await self.session.execute(stmnt)
        return result.all()   

有问题的模型

class ModelA(Base):
    __tablename__ = "modela"
    name = Column(Text, nullable=True)
    bs = relationship("ModelB", back_populates="a", lazy="joined")


class ModelB(Base):
    __tablename__ = "modelb"
    name = Column(Text, nullable=False)
    a_id = Column(BigInteger, ForeignKey("a.id"), nullable=False)
    a = relationship("ModelA", back_populates="bs", lazy="joined")

我试图从表中检索列和关系,同时仍然控制检索哪些列或关系。问题是,当我选择特定列同时选择表的特定关系时,它会给出上述错误。但是,当我执行类似

select(ModelA).options(selectinload(ModelA.my_relationship)
这样的查询时,它可以工作,但它会为我提供所有列和关系。当我运行类似
select(*columns)
的内容(其中列是 SQLAlchemy 表模型列)时,我得到了列,但没有得到我想要的关系。如何进行查询以便可以动态选择列和关系?

python asynchronous sqlalchemy
1个回答
0
投票

虽然这个问题很久以前就被问到了,但我会提供一个答案,因为它可能仍然与其他人相关。

将 select(ModelA) 与 'with_only_colums(*columns)' 一起使用。

© www.soinside.com 2019 - 2024. All rights reserved.