Выберите «ON», Python SQL Alchemy - PullRequest
       11

Выберите «ON», Python SQL Alchemy

0 голосов
/ 07 февраля 2019

У нас есть список книг на странице, когда вы нажимаете на книгу, мы хотим, чтобы вы были перенаправлены на последнюю версию

  • Книги не содержат ссылкик версии (а также не может иметь версию, еще не полученную)
  • Каждая версия содержит ссылку на книгу

Я пытаюсь преобразовать запрос SQL в SQLAlchemy:

SELECT book.id, book.name, version.id, version.preview_url
FROM    books as book
LEFT OUTER JOIN    versions as version
ON      version.id = (
    SELECT TOP 1 id
    FROM versions
    WHERE book_id = book.id
    ORDER BY versions.id DESC
)

Я печатаю список книг, когда вы нажимаете на книгу, я хочу, чтобы вы были перенаправлены на последнюю версию, поэтому мне нужен последний идентификатор версии для каждой книги.Запрос SQL работает, но после нескольких попыток не удается выполнить его в SQLAlchemy.

subquery = session.query(Version)\
                  .filter(Book.id == Version.book_id)\
                  .order_by(Version.id.desc())\
                  .limit(1)\
                  .subquery()
query = session.query(Book)\
               .join(Version, Version.id == subquery)\
               .order_by(Book.id.desc())

SQLAlchemy вставляет предложение FROM в подзапрос: FROM Book, Version также вводит предложение FROMиз основного запроса, поэтому Book будет загружен два раза и получит ошибку ...

1 Ответ

0 голосов
/ 10 февраля 2019

Это похоже на коррелированный подзапрос, это может работать:

subquery = session.query(Version) \
                  .filter(Book.id == Version.book_id) \
                  .order_by(Version.id.desc()) \
                  .limit(1) \
                  .correlate(Book)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...