Jak połączyć dwie kolumny i zastosować filtr? Na przykład chcę wyszukiwać w obu kolumnach „imię” i „nazwisko” w tym samym czasie. Oto, jak to robiłem, przeszukując tylko jedną kolumnę:
query = meta.Session.query(User).filter(User.firstname.like(searchVar))
python
sql
database
sqlalchemy
teggy
źródło
źródło
Odpowiedzi:
Można to zrobić na kilka sposobów:
Korzystanie
filter()
( i operator)query = meta.Session.query(User).filter( User.firstname.like(search_var1), User.lastname.like(search_var2) )
Korzystanie
filter_by()
( i operator)query = meta.Session.query(User).filter_by( firstname.like(search_var1), lastname.like(search_var2) )
Łańcuch
filter()
lubfilter_by()
( i operator)query = meta.Session.query(User).\ filter_by(firstname.like(search_var1)).\ filter_by(lastname.like(search_var2))
Korzystanie
or_()
,and_()
oraznot()
from sqlalchemy import and_, or_, not_ query = meta.Session.query(User).filter( and_( User.firstname.like(search_var1), User.lastname.like(search_var2) ) )
źródło
filter_by
docs powiedzieć , że jest to argument za filtrowanie słów kluczowych:query(Foo).filter_by(bar='baz')
. Jak to się ma do składni, której użyłeś w swojej odpowiedzi powyżej?Możesz po prostu zadzwonić
filter
wiele razy:query = meta.Session.query(User).filter(User.firstname.like(searchVar1)). \ filter(User.lastname.like(searchVar2))
źródło
filter()
metod a użyciem kombinacji wielu warunków (przezor_
luband_
) w jednymfilter
, na dużych tabelach mysql?filter
połączeń działałoby jak logiczne,AND
a nieOR
?Możesz użyć
or_
funkcji SQLAlchemy do wyszukiwania w więcej niż jednej kolumnie (podkreślenie jest konieczne, aby odróżnić ją od własnej w Pythonieor
).Oto przykład:
from sqlalchemy import or_ query = meta.Session.query(User).filter(or_(User.firstname.like(searchVar), User.lastname.like(searchVar)))
źródło
|
operatora zamiastor_
, w ten sposób -(User.firstname.like(searchVar)) | (User.lastname.like(searchVar))
jednak powinieneś uważać na|
pierwszeństwo, bez nawiasów może to dać BARDZO nieoczekiwane wyniki, gdy zostanie zmieszane z operatorami porównania.filter.or_( case1, case 2)
?Ogólny fragment kodu, który będzie działał dla wielu kolumn. Można to również wykorzystać, jeśli istnieje potrzeba warunkowego zaimplementowania funkcji wyszukiwania w aplikacji.
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()
Zanotuj
%%
ważne jest, aby pominąć% formatowania zapytania.źródło