update tutorial query example español python sqlalchemy

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