我对SQLAlchemy有一个问题,我无法找出造成此错误的原因:
所以我的班级定义是:
class PricingFrequency(enum.Enum):
month = 'month'
year = 'year'
class PlanPricing(Base):
__tablename__ = "PlansPricing"
pricing_id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
.....
subscription_plan = relationship("SubscriptionPlan", back_populates="plans_pricing")
plan_id = Column(UUID(as_uuid=True), ForeignKey("SubscriptionPlans.plan_id"))
created_on = Column(DateTime, server_default=func.now())
updated_on = Column(DateTime, server_default=func.now(), server_onupdate=func.now())
class SubscriptionPlanOption(Base):
__tablename__ = "SubscriptionPlanOptions"
option_id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
.....
subscription_plan = relationship("SubscriptionPlan", back_populates="options_plan")
plan_id = Column(UUID(as_uuid=True), ForeignKey("SubscriptionPlans.plan_id"))
created_on = Column(DateTime, server_default=func.now())
updated_on = Column(DateTime, server_default=func.now(), server_onupdate=func.now())
class SubscriptionPlan(Base):
__tablename__ = "SubscriptionPlans"
plan_id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
plan_name = Column(String)
plan_description = Column(String)
is_popular = Column(Boolean, default=False)
plans_pricing: List[Any] = relationship("PlanPricing", back_populates="subscription_plan") # , lazy='joined')
options_plan: List[Any] = relationship("SubscriptionPlanOption",
back_populates="subscription_plan") # lazy='joined')
created_on = Column(DateTime, server_default=func.now())
updated_on = Column(DateTime, server_default=func.now(), server_onupdate=func.now())
当我提出这个查询时:
query = (
select(SubscriptionPlan)
.options(joinedload(SubscriptionPlan.options_plan, innerjoin=True),
joinedload(SubscriptionPlan.plans_pricing.and_(PlanPricing.pricing_id == pricing_id),
innerjoin=True))
)
items = await session.execute(query)
items = items.scalars().all()
我收到了一条错误消息:
**The unique() method must be invoked on this Result, as it contains results that include joined eager loads against collections**
注意:会话是AsyncSession
有人能解释一下这个问题的根源吗?谢谢
发布于 2022-10-24 21:48:58
我误解了sqlalchemy的装货技术。尽管如此,我的请求没有很好的格式化,因此我将其更改为那样,并且它目前正在运行。谢谢
plan_pricing_aliased1 = aliased(PlanPricing)
plan_pricing_aliased2 = aliased(PlanPricing)
query = (
select(plan_pricing_aliased1.pricing_id, plan_pricing_aliased2.pricing_id).join_from(
plan_pricing_aliased1,
plan_pricing_aliased2,
and_(
plan_pricing_aliased2.currency == plan_pricing_aliased1.currency,
plan_pricing_aliased2.plan_id == plan_pricing_aliased1.plan_id,
plan_pricing_aliased2.pricing_frequency == plan_pricing_aliased1.pricing_frequency))
.where(
and_(plan_pricing_aliased1.pricing_id == pricing_id, plan_pricing_aliased1.price > 0,
plan_pricing_aliased2.price == 0))
)
items = await session.execute(query)
items = items.first()
return items
https://stackoverflow.com/questions/74179020
复制相似问题