2017-09-12 3 views
0

Ceci est une question simple. Quel est le meilleur à utiliser, deux filters ou un and_? Y a-t-il une différence?Sqlalchemy deux filtres contre un et

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() 

Ils me donnent le même résultat, mais est-il une différence i vitesse ou quoi que ce soit d'autre?

+0

Aucune différence significative (dans l'exemple donné). –

+0

@ 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

+0

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). –

Répondre

1

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_.