如何将所有内容放入一个查询中?

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

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 作为查询中的子查询。我做不到。以及如何正确地从中获取数据

sqlalchemy
1个回答
0
投票

检查文档!我认为这很清楚。

为了让您走上正轨,您尝试在子查询选择中使用 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 倍,那么您必须学习基础知识 + 解决复杂的问题。

如今阅读文档的技能被低估了。

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