[英]translate from SQL to SQLAlchemy
i have the following sql script. 我有以下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
and need help to illustrate in sqlalchemy. 并且需要帮助来说明sqlalchemy。 Please can someone help me?
有人可以帮我吗?
The following doesn't work: 以下内容不起作用:
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()
Thank you very much! 非常感谢你!
Cheers 干杯
The most direct way to translate your SQL query is the ORM query below: 转换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()
produces: 产生:
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
I also think this would be the faster implementation compared to an alternative of using any
(see below), which is more concise, but the SQL
it produces is not. 我还认为,与使用
any
的替代方法(参见下文)相比,这将是更快的实现,这更加简洁,但是它生成的SQL
却不是。 This also assumes there is a relationship Movie.possessions = relationship(Possession)
: 这也假设存在一个关系
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()
produces: 产生:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.