Les deux requêtes de votre question ont les mêmes performances. Vous pouvez tester cela facilement en inspectant la requête SQL résultante.
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
Les deux requêtes produisent la même expression SQL.
and_and_ est couramment utilisé lorsque vous utilisez l'expression SQL pour interroger directement des tables ou pour imbriquer plusieurs prédicats au sein de or_
.
Aucune différence significative (dans l'exemple donné). –
@ IljaEverilä Ceci est juste un exemple simple pour montrer ce que je veux dire (code minimal). Mais que faire si là où plus (10 +, 20 +) filtres ou ands_? – kemis
La réponse habituelle à "différence de vitesse" est: mesurer. La chose est que les deux ont leurs utilisations. Vous ne pouvez pas exprimer certaines choses avec juste 'Query.filter()' que vous pouvez avec 'et _()' (facilement, sans De Morgan). –