¿Cómo combino dos columnas y aplico el filtro? Por ejemplo, quiero buscar en las columnas "nombre" y "apellido" al mismo tiempo. Así es como lo he estado haciendo si buscaba solo una columna:
query = meta.Session.query(User).filter(User.firstname.like(searchVar))
python
sql
database
sqlalchemy
teggy
fuente
fuente
Respuestas:
Hay varias formas de hacerlo:
Usando
filter()
( y operador)query = meta.Session.query(User).filter( User.firstname.like(search_var1), User.lastname.like(search_var2) )
Usando
filter_by()
( y operador)query = meta.Session.query(User).filter_by( firstname.like(search_var1), lastname.like(search_var2) )
Encadenamiento
filter()
ofilter_by()
( y operador)query = meta.Session.query(User).\ filter_by(firstname.like(search_var1)).\ filter_by(lastname.like(search_var2))
El uso
or_()
,and_()
ynot()
from sqlalchemy import and_, or_, not_ query = meta.Session.query(User).filter( and_( User.firstname.like(search_var1), User.lastname.like(search_var2) ) )
fuente
filter_by
documentos dicen que es para filtrar el argumento de palabras clave:query(Foo).filter_by(bar='baz')
. ¿Cómo se relaciona eso con la sintaxis que usó en su respuesta anterior?Simplemente puede llamar
filter
varias veces:query = meta.Session.query(User).filter(User.firstname.like(searchVar1)). \ filter(User.lastname.like(searchVar2))
fuente
filter()
métodos y el uso de la combinación de múltiples condiciones (poror_
oand_
) en una solafilter
, en grandes tablas mysql?filter
llamadas múltiples actuarían como una lógica enAND
lugar de unaOR
?Puede usar la
or_
función de SQLAlchemy para buscar en más de una columna (el guión bajo es necesario para distinguirla de la de Pythonor
).He aquí un ejemplo:
from sqlalchemy import or_ query = meta.Session.query(User).filter(or_(User.firstname.like(searchVar), User.lastname.like(searchVar)))
fuente
|
operador en lugar deor_
, así(User.firstname.like(searchVar)) | (User.lastname.like(searchVar))
, sin embargo, debe tener cuidado con la|
precedencia, sin paréntesis puede producir resultados MUY inesperados cuando se mezcla con operadores de comparación.filter.or_( case1, case 2)
?Un fragmento de código genérico que funcionará para varias columnas. Esto también se puede utilizar si es necesario implementar condicionalmente la funcionalidad de búsqueda en la aplicación.
search_key = "abc" search_args = [col.ilike('%%%s%%' % search_key) for col in ['col1', 'col2', 'col3']] query = Query(table).filter(or_(*search_args)) session.execute(query).fetchall()
Nota:
%%
es importante omitir% formatear la consulta.fuente