¿Cuál es la diferencia entre filter y filter_by en SQLAlchemy?

¿Alguien podría explicar la diferencia entre las funciones filter y filter_by en SQLAlchemy? Estoy confundido y realmente no puedo ver la diferencia. ¿Cuál debería estar usando?

filter_by se usa para consultas simples en los nombres de columna usando kwargs regulares, como

db.users.filter_by(name='Joe')

Lo mismo se puede lograr con el filter , no utilizando kwargs, sino que se utiliza el operador de igualdad ‘==’, que se ha sobrecargado en el objeto db.users.name:

db.users.filter(db.users.name=='Joe')

También puede escribir consultas más potentes utilizando un filter , como expresiones como:

db.users.filter(or_(db.users.name=='Ryan', db.users.country=='England'))

De hecho, originalmente se fusionaron entre sí, es decir, había un método similar a “filtro” que aceptaba * args y ** kwargs, donde se podían pasar una expresión SQL o argumentos de palabras clave (o ambos). De hecho, me parece mucho más conveniente, pero la gente siempre se confundió con eso, ya que por lo general todavía están superando la diferencia entre column == expression y keyword = expression . Así que los dividimos.

filter_by usa argumentos de palabras clave, mientras que filter permite argumentos de filter(User.name=="john") como filter(User.name=="john")

Es un azúcar de syntax para escribir consultas más rápido. Su implementación en pseudocódigo:

 def filter_by(self, **kwargs): return self.filter(sql.and_(**kwargs)) 

Para Y simplemente puede escribir:

 session.query(db.users).filter_by(name='Joe', surname='Dodson') 

por cierto

 session.query(db.users).filter(or_(db.users.name=='Ryan', db.users.country=='England')) 

Se puede escribir como

 session.query(db.users).filter((db.users.name=='Ryan') | (db.users.country=='England')) 

También puede obtener el objeto directamente por PK a través del método get :

 Users.query.get(123) # And even by a composite PK Users.query.get(123, 321) 

Cuando se usa get case, es importante que el objeto se pueda devolver sin solicitud de base de datos desde el identity map que se puede usar como caché (asociado a la transacción)