Использование функции объединения после объединения.Получение sqlite3.OperationalError для order_by перед объединением - PullRequest
0 голосов
/ 07 июня 2019

Сначала мне удалось решить эту проблему, но я не понимаю, почему мой первый подход не работает. Будем рады за помощь. Я использовал order_by, чтобы присоединиться и получил ошибку, если попытался объединить результат

Это для Flask и sqlalchemy в базе данных sqlite3.

Я знаю, что это избыточно, я попытался объединить две таблицы и объединить результат с другим запросом. При сортировке (order_by) объединения я получаю исключение в объединении.

Оригинальный подход -

    def followed_posts(self):
        followed = Post.query.join(
            followers,
            (followers.c.followed_id == Post.user_id)
        ).filter(
            followers.c.follower_id == self.id
        ).order_by(
            Post.timestamp.desc()
        )
        return followed.union(self.posts)

Это не удалось с: "sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) возле" UNION ": синтаксическая ошибка"

Когда я пытаюсь вернуть followed без объединения, ошибки не возникает. но это не то, что мне нужно.

    def followed_posts(self):
        followed = Post.query.join(
            followers,
            (followers.c.followed_id == Post.user_id)
        ).filter(
            followers.c.follower_id == self.id
        ).order_by(
            Post.timestamp.desc()
        )
        return followed

когда я перемещаю order_by из объединения в объединение, оно работает без проблем.

    def followed_posts(self):
        followed = Post.query.join(
            followers,
            (followers.c.followed_id == Post.user_id)
        ).filter(
            followers.c.follower_id == self.id
        )
        return followed.union(self.posts).order_by(Post.timestamp.desc())

Так что это решаемо, но я не понимаю, почему оригинальный подход вернул ошибку.

1 Ответ

0 голосов
/ 07 июня 2019

Он вернул ошибку, потому что вы пытались сделать что-то, что sqlite не позволяет.

Из документации :

В составном SELECT,все составляющие SELECT должны возвращать одинаковое количество столбцов результата.Поскольку компоненты составного SELECT должны быть простыми инструкциями SELECT, они могут не содержать предложений ORDER BY или LIMIT.Предложения ORDER BY и LIMIT могут появляться только в конце всего составного SELECT, и только в том случае, если последний элемент составного не является предложением VALUES.

и

В составном операторе SELECT только последний или самый правый простой оператор SELECT может иметь предложение ORDER BY.Это предложение ORDER BY будет применяться ко всем элементам соединения.Если самый правый элемент составного оператора SELECT является предложением VALUES, то предложение ORDER BY для этого оператора не допускается.

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