Wie kombiniere ich zwei Spalten und wende Filter an? Zum Beispiel möchte ich gleichzeitig in den Spalten "Vorname" und "Nachname" suchen. So habe ich es gemacht, wenn ich nur eine Spalte durchsucht habe:
query = meta.Session.query(User).filter(User.firstname.like(searchVar))
python
sql
database
sqlalchemy
teggy
quelle
quelle
Antworten:
Es gibt verschiedene Möglichkeiten, dies zu tun:
Verwenden
filter()
( und Operator)query = meta.Session.query(User).filter( User.firstname.like(search_var1), User.lastname.like(search_var2) )
Verwenden
filter_by()
( und Operator)query = meta.Session.query(User).filter_by( firstname.like(search_var1), lastname.like(search_var2) )
Verkettung
filter()
oderfilter_by()
( und Bediener)query = meta.Session.query(User).\ filter_by(firstname.like(search_var1)).\ filter_by(lastname.like(search_var2))
Unter Verwendung
or_()
,and_()
undnot()
from sqlalchemy import and_, or_, not_ query = meta.Session.query(User).filter( and_( User.firstname.like(search_var1), User.lastname.like(search_var2) ) )
quelle
filter_by
Dokumente sagen, dass es zum Filtern nach Schlüsselwortargumenten dient :query(Foo).filter_by(bar='baz')
. Wie hängt das mit der Syntax zusammen, die Sie in Ihrer obigen Antwort verwendet haben?Sie können einfach
filter
mehrmals anrufen :query = meta.Session.query(User).filter(User.firstname.like(searchVar1)). \ filter(User.lastname.like(searchVar2))
quelle
filter()
Methoden und der Kombination mehrerer Bedingungen (nachor_
oderand_
) in einer einzigenfilter
großen MySQL-Tabelle?filter
AnrufeAND
eher logisch als logisch seinOR
?Sie können die
or_
Funktion von SQLAlchemy verwenden , um in mehr als einer Spalte zu suchen (der Unterstrich ist erforderlich, um ihn von Pythons eigener zu unterscheidenor
).Hier ist ein Beispiel:
from sqlalchemy import or_ query = meta.Session.query(User).filter(or_(User.firstname.like(searchVar), User.lastname.like(searchVar)))
quelle
|
Operator stattor_
, so -(User.firstname.like(searchVar)) | (User.lastname.like(searchVar))
, aber Sie sollten vorsichtig sein|
Vorrang, ohne Klammer kann es produzieren sehr unerwartete Ergebnisse , wenn sie mit comparsion Betreiber gemischt.filter.or_( case1, case 2)
?Ein generischer Code, der für mehrere Spalten funktioniert. Dies kann auch verwendet werden, wenn Suchfunktionen in der Anwendung bedingt implementiert werden müssen.
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()
Hinweis: Es
%%
ist wichtig, die% -Formatierung der Abfrage zu überspringen.quelle