首页 > 解决方案 > slqalchemy 命令的顺序对生成的 sql 查询有影响吗?

问题描述

我的 sqlalchemy 查询中的命令顺序是否会影响生成的 sql 查询中的操作顺序?

例如这是

result = db.session.query(Class, Student, SpecialNeed) \
                    .filter(Student.age > 10,
                        Student.class_id == Class.id) \
                    .outerjoin(SpecialNeed, \
                        and_(SpecialNeed.student_id == Student.id , \
                            SpecialNeed.valid == True))

和这个一样吗?

result = db.session.query(Class, Student, SpecialNeed) \
                    .outerjoin(SpecialNeed, \
                        and_(SpecialNeed.student_id == Student.id , \
                            SpecialNeed.valid == True))\
                    .filter(Student.age > 10,
                        Student.class_id == Class.id)

这是

result = db.session.query(Class, Student, SpecialNeed) \
                    .filter(Student.age > 10) \
                    .filter(Student.class_id == Class.id)

和这个一样吗?

result = db.session.query(Class, Student, SpecialNeed) \
                    .filter(Student.age > 10,
                        Student.class_id == Class.id)

标签: pythonsqlalchemy

解决方案


在您的情况下,否,两种情况下的查询都是相同的。由于 SQL 的工作方式,前两个是相同的;首先是FROM列表,然后WHERE是 ,依此类推。Query与SQLAlchemy中的构建器模式相比,SQL 只是具有严格的语法来规定子句的顺序。在后面的查询filter(x, y)中是一样的filter(x).filter(y),都产生x AND y

SQLAlchemy 中有一些Query方法确实依赖于顺序或影响其他操作的顺序,例如Query.filter_by(), 和Query.from_self()。SQL 中还有一些依赖于操作数顺序的操作,例如LEFT JOIN.

所以标题的答案是:它可以,但并非总是如此。除了了解底层 SQL 之外,您还必须查看文档并了解操作的作用。


推荐阅读