Как преобразовать этот SQL-запрос в SQLAlchemy - PullRequest
0 голосов
/ 30 сентября 2018

У меня проблема с преобразованием этого 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 Ответ

0 голосов
/ 30 сентября 2018

Удалить

filter(Recipe.id == Rating.recipe_id)

, поскольку внешнее соединение уже создает правильное предложение ON на основе отношения внешнего ключа между моделями.Выражение фильтра добавляется в предложение WHERE и приводит к UNKNOWN для строк, которые не имеют рейтинга, и поэтому они удаляются из результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...