2017-02-14 41 views
2

我目前正在學習SQLAlchemy的,我有一個評價模型,它看起來是這樣的:如何從SQLAlchemy查詢獲取AVG?

class Review(Base): 

__tablename__ = "reviews" 

id = Column(Integer, primary_key=True) 
raw_score = Column(String(150)) 
score = Column(Float, nullable=False) 
summary = Column(String(150), nullable=False) 
review = Column(String(1500), nullable=False) 
source = Column(String) 
product_id = Column(Integer, ForeignKey('products.id'), nullable=False) 
reviewer_id = Column(Integer, ForeignKey('reviewers.id'), nullable=False) 

使用SQLAlchemy的,我能夠得到所有關於某產品的評論,如果審稿人是不是評論家:

reviews = session.query(Review).join(Review.reviewer).\ 
     filter(Review.product == product).\ 
     filter(Reviewer.critic == False).\ 
     values(Reviewer.critic, 
       Reviewer.display_name, 
       Review.raw_score, 
       Review.score, 
       Review.review, 
       Review.source) 

然後我試圖再次查詢,讓我由評論家和批評家不寫分數的平均值:

critic_avg = session.query(func.avg(Review.score)).filter(Review.product == product).\ 
      filter(Reviewer.critic == True) 

not_critic_avg = session.query(func.avg(Review.score)).filter(Review.product == product).\ 
      filter(Reviewer.critic == False) 

然而,這並沒有讓我回到預期的價值,它似乎總是讓我回到產品的平均分數。它似乎是產品的過濾器正在工作,但篩選器的批評不是。

預計非評論家平均:2.75

實際非評論家平均:2.75

(有沒有審稿誰在DB評論家還)

預計評論家平均:0.00

實際評論家平均分:2.75

好奇的是,如果上面有明顯的錯誤,並且如果有更有效的方法反駁這一點。我能否在我查詢評論的同時解決這個問題?

一如既往,再次感謝。

回答

1

你已經忘記加入Reviewer表,雖然你已經在以前的請求正確完成它:

critic_avg = session.query(func.avg(Review.score)).\ 
    join(Reviewer).\ 
    filter(Review.product == product).\ 
    filter(Reviewer.critic == True) 

UPD:在SQLAlchemy中構建每個查詢產生的SQL語句。您可以使用Query.as_scalar()方法來只是打印您的查詢的實際SQL語句並找到一個錯誤。在你的情況下,查詢是這樣的:

SELECT avg(reviews.score) FROM reviews WHERE reviews.reviewer_id = :param_1 AND reviewers.critic = True; 
+0

這真的很有幫助。非常感謝您指出query.as_scalar() – pyNovice89

+1

您可以爲此打印任何查詢或表達式,無需首先使用'as_scalar'創建標量子查詢。 –

+0

@IljaEverilä真遺憾,我不知道這件事。非常感謝! –