在python SQL Alchemy上选择“ ON”子句

时间:2019-02-07 17:11:47

标签: python sqlalchemy

  

我们在页面上有一个书单,当您单击一本书时,我们希望您成为   重定向到最新版本

  • 书籍不包含对版本的引用(并且也不能具有尚未收到的版本)
  • 每个版本都包含书籍参考书

我很难在SQLAlchemy中转换SQL请求:

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
)

我打印一本书的清单,当您单击一本书时,我希望您被重定向到最新版本,因此我需要每本书的最新版本ID。 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 :(得分:0)

看起来像一个相关的子查询,这可能有用:

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