Czy ktoś może wyjaśnić różnicę między filter
i filter_by
funkcje w SQLAlchemy? Którego powinienem używać?
python
sqlalchemy
bodacydo
źródło
źródło
db.users.name=='Ryan'
oceniałby raz na stały, a następnie byłby bez znaczenia odtąd? Wydaje się, że aby to zadziałało, trzeba by użyć lambda.type(model.column_name == 'asdf')
→sqlalchemy.sql.elements.BinaryExpression
.filter
. zapytanie jakid=12345
,query(users).filter(id == id)
nie będzie filtrowaćusers.id
. Zamiast tego oceniid == id
jakoTrue
i zwróci wszystkich użytkowników. Musisz użyć.filter(users.id == id)
(jak pokazano powyżej). Dzisiaj popełniłem ten błąd.Tak naprawdę pierwotnie je scaliliśmy, tzn. Istniała metoda podobna do „filtru”, która zaakceptowała
*args
i**kwargs
, gdzie można było przekazać wyrażenie SQL lub argumenty słowa kluczowego (lub oba). Uważam, że jest to o wiele wygodniejsze, ale ludzie zawsze byli tym zdezorientowani, ponieważ zwykle wciąż przekraczają różnicę międzycolumn == expression
ikeyword = expression
. Więc podzieliliśmy je.źródło
column == expression
kontrakeyword = expression
jest kluczową kwestią do rozróżnienia międzyfilter
ifilter_by
. Dzięki!filter_by
może być trochę szybsze niżfilter
.filter_by
to, aby móc napisać jutro nazwę pola, dla tej klasy, bez zadawania pytań - podczas gdyflter
wymaga rzeczywistego obiektu kolumny - który zwykle wymaga wpisania (i odczytania) przynajmniej nadmiarowej nazwy klasy. Więc jeśli ktoś chce filtrować według równości, jest to raczej wygodne.filter_by
używa argumentów słów kluczowych, natomiastfilter
pozwala na filtrowanie argumentów pythonicznych, takich jakfilter(User.name=="john")
źródło
Jest to cukier składniowy do szybszego pisania zapytań. Jego implementacja w pseudokodzie:
Dla AND możesz po prostu napisać:
btw
można zapisać jako
Możesz także uzyskać obiekt bezpośrednio przez PK
get
metodą:W
get
przypadku użycia przypadku ważne jest, aby obiekt mógł zostać zwrócony bez żądania bazy danych, zidentity map
którego można go wykorzystać jako pamięć podręczną (powiązaną z transakcją)źródło
users.filter
z poprzedniej odpowiedzi. I może to być moja wina :)query
atrybut jest zapytanie_property i jest to obecnie dość standardowy cukier