简体   繁体   English

从SQL转换为SQLAlchemy

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM