从SQL转换为SQLAlchemy

时间:2013-04-21 06:35:25

标签: python sql sqlalchemy

我有以下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()

非常感谢!

干杯

1 个答案:

答案 0 :(得分: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