Przejrzałem dokumenty i wydaje mi się, że nie mogę dowiedzieć się, jak wykonać zapytanie OR w SQLAlchemy. Chcę tylko wykonać to zapytanie.
SELECT address FROM addressbook WHERE city='boston' AND (lastname='bulger' OR firstname='whitey')
Powinno być coś takiego
addr = session.query(AddressBook).filter(City == "boston").filter(????)
python
sqlalchemy
JiminyCricket
źródło
źródło
filter(or_(User.name == v for v in ('Alice', 'Bob', 'Carl')))
in_
operatora w następujący sposób:filter(User.name.in_(['Alice', 'Bob', 'Carl']))
SQLAlchemy przeciąża operatory bitowe
&
,|
a~
więc zamiast brzydkie i trudne do odczytania z prefiksu składniaor_()
iand_()
(jak w odpowiedzi na Bastien ) można użyć następujących operatorów:Zauważ, że nawiasy nie są opcjonalne ze względu na pierwszeństwo operatorów bitowych.
Więc całe zapytanie może wyglądać następująco:
źródło
&
między nimi a pierwszym (zamiast używać drugiegofilter
wywołania) dla tego samego efektu?or_()
funkcja może być przydatna w przypadku nieznanej liczby elementów zapytania OR.Załóżmy na przykład, że tworzymy usługę REST z kilkoma opcjonalnymi filtrami, które powinny zwrócić rekord, jeśli którykolwiek z filtrów zwróci wartość true. Z drugiej strony, jeśli parametr nie został zdefiniowany w zapytaniu, nasze zapytanie nie powinno się zmienić. Bez
or_()
funkcji musimy zrobić coś takiego:Dzięki
or_()
funkcji można go przepisać do:źródło
To było bardzo pomocne. Oto moja implementacja dla dowolnej tabeli:
źródło