¿Alguien podría explicar la diferencia entre filter
y filter_by
funciones en SQLAlchemy? ¿Cuál debería estar usando?
python
sqlalchemy
bodacydo
fuente
fuente
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.type(model.column_name == 'asdf')
→sqlalchemy.sql.elements.BinaryExpression
.filter
. una consulta comoid=12345
,query(users).filter(id == id)
no se filtraráusers.id
. En cambio, evaluaráid == id
comoTrue
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 entrecolumn == expression
ykeyword = expression
. Entonces los dividimos.fuente
column == expression
vs.keyword = expression
es el punto clave que debe hacerse sobre la diferencia entrefilter
yfilter_by
. ¡Gracias!filter_by
podría ser un poco más rápido quefilter
.filter_by
es poder escribir solo el nombre del campo, para esa clase, no se hacen preguntas, aunqueflter
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 quefilter
permite argumentos de filtrado pitónico comofilter(User.name=="john")
fuente
Es un azúcar de sintaxis para una escritura de consulta más rápida. Su implementación en pseudocódigo:
Para Y puedes simplemente escribir:
por cierto
Se puede escribir como
También puede obtener objetos directamente por PK a través del
get
método: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 laidentity map
cual se puede usar como caché (asociado con la transacción)fuente
users.filter
de la respuesta anterior. Y puede ser mi culpa :) elquery
atributo es query_property y es un azúcar bastante estándar hoy en día