Sqlalchemy两个过滤器与一个和

时间:2017-09-12 09:58:36

标签: python sqlalchemy

这是一个直截了当的问题。什么是最好使用,两个filters或一个and_?有什么区别吗?

session.query(Test).filter(Test.id == X).filter(Test.test == Y).all()

VS

session.query(Test).filter(and_(Test.id == X, Test.test == Y)).all()

他们会给我相同的结果,但速度或其他方面有什么不同吗?

1 个答案:

答案 0 :(得分:3)

您问题中的两个查询都具有相同的效果。您可以通过检查生成的SQL查询来轻松地进行测试。

from sqlalchemy import Column, Integer, String, and_
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm.query import Query

Base = declarative_base()

class Test(Base):
    __tablename__ = 'test'
    id = Column(Integer, primary_key=True)
    test = Column(String(50))


print(Query([Test]).filter(Test.id == 1).filter(Test.test == 'foo'))

# SELECT test.id AS test_id, test.test AS test_test
# FROM test
# WHERE test.id = :id_1 AND test.test = :test_1

print(Query([Test]).filter(and_(Test.id == 1, Test.test == 'foo')))

# SELECT test.id AS test_id, test.test AS test_test
# FROM test
# WHERE test.id = :id_1 AND test.test = :test_1

两个查询都生成相同的SQL表达式。

当您使用SQL表达式直接查询表时,或者在or_内嵌套多个谓词时,通常会使用

and_