这是一个直截了当的问题。什么是最好使用,两个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()
他们会给我相同的结果,但速度或其他方面有什么不同吗?
答案 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_。