如何将此 SQL 查询转换为 SQLAlchemy

Posted

技术标签:

【中文标题】如何将此 SQL 查询转换为 SQLAlchemy【英文标题】:How to convert this SQL Query to SQLAlchemy 【发布时间】:2018-09-30 05:40:20 【问题描述】:

我在将此 SQL 查询转换为 SQLAlchemy 时遇到问题

SELECT Recipe.id, Recipe.name, AVG(Rating.rating) AS ar FROM Recipe LEFT OUTER JOIN Rating ON Recipe.id = Rating.recipe_id GROUP BY Recipe.id ORDER BY Recipe.id ASC;

我目前有:

session.query(Recipe,func.avg(Rating.rating).label('average')).outerjoin(Rating).filter(Recipe.id == Rating.recipe_id).group_by(Recipe.id).all()

但这会返回与此类似的内容,但缺少没有任何评级的元素:

 id |       name       |         ar
----+------------------+--------------------
  1 | First Response   | 4.0000000000000000
 34 | First Response 2 | 3.0000000000000000

当命令行中的 PostgreSQL 查询返回时:

 id |       name       |         ar
----+------------------+--------------------
  1 | First Response   | 4.0000000000000000
 34 | First Response 2 | 3.0000000000000000
 35 | First Response 2 |
 36 | First Response 2 |

这些是我的模型:

class Recipe(Base):
    __tablename__ = 'recipe'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    prep_time = Column(Integer)
    difficulty = Column(Integer)
    vegeterian = Column(Boolean)
    user_id = Column(Integer, ForeignKey('user.id'))
    ratings = relationship("Rating")

    def __repr__(self):
        return "<Recipe(name='', prep_time='', difficulty='', vegeterian='', user='')>".format(
            self.name, self.prep_time, self.difficulty, self.vegeterian, self.user_id
        )

class Rating(Base):
    __tablename__ = 'rating'
    id = Column(Integer, primary_key=True)
    recipe_id = Column(Integer, ForeignKey('recipe.id'))
    rating = Column(Integer)

    def __repr__(self):
        return "<Rating(name='', rating='')>".format(self.recipe.name, self.rating)

任何帮助将不胜感激!非常感谢。

【问题讨论】:

【参考方案1】:

删除

filter(Recipe.id == Rating.recipe_id)

因为外连接已经根据模型之间的外键关系生成了正确的 ON 子句。过滤器表达式被添加到 WHERE 子句中,对于没有评级的行会导致 UNKNOWN,因此它们会从结果中删除。

【讨论】:

非常感谢!有效。我当时并没有意识到这一点。非常感谢您的快速回复。

以上是关于如何将此 SQL 查询转换为 SQLAlchemy的主要内容,如果未能解决你的问题,请参考以下文章

如何将此 SQL 查询转换为 NSFetchRequest

如何将此 sql 查询转换为 mongodb?

如何将此 SQL 查询转换为 Django?

如何将此 SQL 内部联接查询转换为 LINQ 语法?

如何将此 SQL 转换为 Laravel Query Builder 查询?

如何将此 sql 查询转换为 laravel 查询生成器