2017-02-14 7 views
2

私は現在、SQLAlchemyのを学んだし、私はこのようになりますレビューモデルがあります: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) 

を、私は特定の製品に関連するすべてのレビューを取得することができるよとレビューがない場合には評論家:

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) 

しかし、これは私に期待値を返すものではなく、常に製品の平均点を返すようです。製品のフィルタが機能しているように見えますが、Filter for Criticはそうではありません。

予想される非評論平均: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ä恥ずかしい、私はこれについて知らなかった。どうもありがとう! –

関連する問題