当尝试从表中选择特定列同时检索关系时,我收到此 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 表模型列)时,我得到了列,但没有得到我想要的关系。如何进行查询以便可以动态选择列和关系?
虽然这个问题很久以前就被问到了,但我会提供一个答案,因为它可能仍然与其他人相关。
将 select(ModelA) 与 'with_only_colums(*columns)' 一起使用。