我有以下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()
非常感谢!
干杯
答案 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