如何从SQLAlchemy Query获取AVG?

时间:2017-02-14 03:17:19

标签: python sql sqlalchemy

我目前正在学习SQLAlchemy,我的评论模型如下:

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

(目前还没有评论家是评论家)

预期评论家平均分:0.00

实际评论家平均值:2.75

好奇上面是否存在明显的错误,以及是否有更有效的解决方法。我可以在查询评论的同时解决这个问题吗?

一如既往,再次感谢。

1 个答案:

答案 0 :(得分:1)

您已忘记加入critic_avg = session.query(func.avg(Review.score)).\ join(Reviewer).\ filter(Review.product == product).\ filter(Reviewer.critic == True) 表,但您已在之前的请求中正确完成:

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

UPD:在SQLAlchemy中构造的每个查询都会生成一个SQL语句。您可以使用Query.as_scalar()方法只打印查询的实际SQL语句并查找错误。在您的情况下,查询是这样的:

<a id="data_table" ng-click="{{ item.target }}"