Respuestas:
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 filter
no usar kwargs, sino con 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 filter
, como expresiones como:
db.users.filter(or_(db.users.name=='Ryan', db.users.country=='England'))
type(model.column_name == 'asdf')
→sqlalchemy.sql.elements.BinaryExpression
.filter
. una consulta como id=12345
, query(users).filter(id == id)
no se filtrará users.id
. En cambio, evaluará id == id
como True
y devolverá a todos los usuarios. .filter(users.id == id)
Debe usar (como se muestra arriba). Cometí este error hoy temprano.
En realidad, los fusionamos originalmente, es decir, había un método similar a un "filtro" que aceptaba , *args
y **kwargs
donde podía 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, ya que generalmente todavía superan la diferencia entre column == expression
y keyword = expression
. Entonces los dividimos.
column == expression
vs. keyword = expression
es el punto clave que debe hacerse sobre la diferencia entre filter
y filter_by
. ¡Gracias!
filter_by
podría ser un poco más rápido que filter
.
filter_by
es poder escribir solo el nombre del campo, para esa clase, no se hacen preguntas, aunque flter
requiere el objeto de columna real, que generalmente requerirá que uno escriba (y lea) al menos un nombre de clase redundante. Entonces, si uno quiere filtrar por igualdad, es bastante conveniente.
filter_by
utiliza argumentos de palabras clave, mientras que filter
permite argumentos de filtrado pitónico comofilter(User.name=="john")
Es un azúcar de sintaxis para una escritura de consulta más rápida. Su implementación en pseudocódigo:
def filter_by(self, **kwargs):
return self.filter(sql.and_(**kwargs))
Para Y puedes simplemente 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 objetos directamente por PK a través del get
método:
Users.query.get(123)
# And even by a composite PK
Users.query.get(123, 321)
Cuando se usa get
mayúsculas y minúsculas, es importante que el objeto se pueda devolver sin una solicitud de base de datos desde la identity map
cual se puede usar como caché (asociado con la transacción)
users.filter
de la respuesta anterior. Y puede ser mi culpa :) el query
atributo es query_property y es un azúcar bastante estándar hoy en día
db.users.name=='Ryan'
evaluaría una vez a una constante y luego no tendría sentido a partir de entonces? Parece que uno necesitaría usar una lambda para que esto funcione.