Fastapi 应用程序。
query = select(Review).options(selectinload(Review.prize)
.options(selectinload(ReceivedPrize.prize)),
selectinload(Review.author)).where(Review.id == review_id)
likes_query = select(
func.count(case((ReviewLike.like == True, 1))).label("likes_count"),
func.count(case((ReviewLike.like == False, 1))).label("dislikes_count")
).where(ReviewLike.review_id == review_id)
user_like_query = select(ReviewLike).where(
ReviewLike.review_id == review_id,
ReviewLike.user_id == user_id
)
models:
class Review(Base):
__tablename__ = "review"
id = Column(Integer, primary_key=True, autoincrement=True)
author_id = Column(Integer, ForeignKey('user.id'), nullable=False)
prize_id = Column(Integer, ForeignKey('received_prize.id'), nullable=False)
title = Column(String, nullable=False)
description = Column(String, nullable=False)
media = Column(ARRAY(String), nullable=True)
created_at = Column(TIMESTAMP, server_default=func.current_timestamp())
author = relationship("User", back_populates="reviews", lazy="select")
prize = relationship("ReceivedPrize", back_populates="reviews", lazy="select")
likes = relationship("ReviewLike", back_populates="review", lazy="select")
class ReviewLike(Base):
__tablename__ = "review_like"
id = Column(Integer, primary_key=True, autoincrement=True)
user_id = Column(Integer, ForeignKey('user.id'), nullable=False)
review_id = Column(Integer, ForeignKey('review.id'), nullable=False)
like = Column(Boolean, nullable=False)
created_at = Column(TIMESTAMP, server_default=func.current_timestamp())
user = relationship("User", back_populates="likes", lazy="select")
review = relationship("Review", back_populates="likes", lazy="select")
现在所有这些查询都可以正常工作。但我需要将 user_like_query 和 likes_query 作为查询中的子查询。我做不到。以及如何正确地从中获取数据
检查文档!我认为这很清楚。
为了让您走上正轨,您尝试在子查询选择中使用 ORM 实体(例如
select(ReviewLike)
),这比选择各个字段然后加入(例如 select(ReviewLike.review_id, ReviewLike.whatever_else)
)要复杂一点.
在文档中,他们给出的示例会自动计算出要加入的约束(例如,在您的情况下为
Review.review_id
),但我认为明确指定它总是更好,这样任何阅读您代码的人都清楚它在做什么。
首先阅读本节(甚至是细则!): https://docs.sqlalchemy.org/en/20/tutorial/data_select.html#subqueries-and-ctes
您要使用的代码在本节中: https://docs.sqlalchemy.org/en/20/tutorial/data_select.html#orm-entity-subqueries-ctes
如果此后您仍然需要帮助,我想 ChatGPT 可以给您快速答复。但如果您是 SQLAlchemy 的新手,我强烈建议您仔细阅读并自行操作。下次 ChatGPT 无法提供帮助时,难度会增加 10 倍,那么您必须学习基础知识 + 解决复杂的问题。
如今阅读文档的技能被低估了。