0

我有以下 sql 脚本。

SELECT *
FROM movies
LEFT JOIN possession
ON movies.id = possession.movie_id
AND possession.master_id = ?
WHERE possession.id is NULL
ORDER BY movies.id DESC

并需要帮助在 sqlalchemy 中进行说明。请问有人可以帮我吗?

以下不起作用:

movies = movie.Movie.query.join(possession.Possession, movie.Movie.id == possession.Possession.movie_id)\
            .filter(possession.Possession.master_id == session.get('userId'))\
            .filter(not_(possession.Possession.id)).order_by(movie.Movie.id.desc()).all()

非常感谢!

干杯

4

1 回答 1

1

翻译 SQL 查询最直接的方法是下面的 ORM 查询:

qry = (session.query(Movie)
        .outerjoin(Possession, and_(Movie.id == Possession.movie_id, Possession.master_id == master_id))
        .filter(Possession.id == None)
        .order_by(desc(Movie.id))
        )
movies = qry.all()

产生:

SELECT movies.id AS movies_id, movies.name AS movies_name
FROM movies LEFT OUTER JOIN possessions ON movies.id = possessions.movie_id AND possessions.master_id = :master_id_1
WHERE possessions.id IS NULL ORDER BY movies.id DESC

我还认为,与使用的替代方法any(见下文)相比,这将是更快的实现,它更简洁,但SQL它产生的不是。这也假设存在关系Movie.possessions = relationship(Possession)

qry = (session.query(Movie)
        .filter(~Movie.possessions.any(Possession.master_id == master_id))
        .order_by(desc(Movie.id))
        )
movies = qry.all()

产生:

SELECT movies.id AS movies_id, movies.name AS movies_name
FROM movies
WHERE NOT (EXISTS (SELECT 1
FROM possessions
WHERE movies.id = possessions.movie_id AND possessions.master_id = :master_id_1)) ORDER BY movies.id DESC
于 2013-04-21T09:30:53.250 回答