python - tutorial - ¿Cuál es la diferencia entre filter y filter_by en SQLAlchemy?
sqlalchemy tutorial español (4)
De hecho, originalmente se fusionaron entre sí, es decir, hubo un método similar al "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 estaba confundida por eso, ya que por lo general todavía están superando la diferencia entre column == expression
y keyword = expression
. Así que los dividimos.
¿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?
Es un azúcar de sintaxis 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)
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 en cambio utilizando 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''))
filter_by
usa argumentos de palabras clave, mientras que filter
permite argumentos de filter(User.name=="john")
como filter(User.name=="john")