Antworten:
filter_by
wird für einfache Abfragen der Spaltennamen mit regulären kwargs wie verwendet
db.users.filter_by(name='Joe')
Dasselbe kann erreicht werden filter
, indem nicht kwargs, sondern der Gleichheitsoperator '==' verwendet wird, der für das Objekt db.users.name überladen wurde:
db.users.filter(db.users.name=='Joe')
Sie können auch leistungsfähigere Abfragen schreiben filter
, indem Sie Ausdrücke wie:
db.users.filter(or_(db.users.name=='Ryan', db.users.country=='England'))
type(model.column_name == 'asdf')
→sqlalchemy.sql.elements.BinaryExpression
.filter
. eine Abfrage wie id=12345
, query(users).filter(id == id)
wird nicht gefiltert werden users.id
. Stattdessen wird es bewerten , id == id
wie True
und alle Benutzer zurück. Sie müssen verwenden .filter(users.id == id)
(wie oben demonstriert). Ich habe diesen Fehler heute früher gemacht.
Wir hatten diese ursprünglich zusammengeführt, dh es gab eine "filter" -ähnliche Methode, die akzeptierte *args
und **kwargs
bei der Sie einen SQL-Ausdruck oder Schlüsselwortargumente (oder beides) übergeben konnten. Eigentlich finde ich das viel bequemer, aber die Leute waren immer verwirrt, da sie normalerweise immer noch über den Unterschied zwischen column == expression
und hinwegkommen keyword = expression
. Also haben wir sie aufgeteilt.
column == expression
vs. keyword = expression
ist der entscheidende Punkt, um den Unterschied zwischen filter
und zu machen filter_by
. Vielen Dank!
filter_by
könnte etwas schneller sein als filter
.
filter_by
besteht darin, in der Lage zu sein, nur den Feldnamen für diese Klasse zu schreiben, ohne dass Fragen gestellt werden - während flter
das eigentliche Spaltenobjekt erforderlich ist -, für die normalerweise mindestens ein redundanter Klassenname eingegeben (und gelesen) werden muss. Wenn man also nach Gleichheit filtern möchte, ist dies ziemlich praktisch.
filter_by
verwendet Schlüsselwortargumente, während filter
pythonische Filterargumente wiefilter(User.name=="john")
Es ist ein Syntaxzucker für schnelleres Schreiben von Abfragen. Seine Implementierung im Pseudocode:
def filter_by(self, **kwargs):
return self.filter(sql.and_(**kwargs))
Für UND können Sie einfach schreiben:
session.query(db.users).filter_by(name='Joe', surname='Dodson')
Übrigens
session.query(db.users).filter(or_(db.users.name=='Ryan', db.users.country=='England'))
kann geschrieben werden als
session.query(db.users).filter((db.users.name=='Ryan') | (db.users.country=='England'))
Sie können das Objekt auch direkt per PK über die folgende get
Methode abrufen :
Users.query.get(123)
# And even by a composite PK
Users.query.get(123, 321)
Bei Verwendung von get
case ist es wichtig, dass das Objekt ohne Datenbankanforderung zurückgegeben werden kann, von identity map
der aus es als Cache verwendet werden kann (im Zusammenhang mit der Transaktion).
users.filter
von vorheriger Antwort. Und vielleicht ist es meine Schuld :) query
Attribut ist query_property und es ist heutzutage ein ziemlich normaler Zucker
db.users.name=='Ryan'
einmal eine Konstante auswerten und dann von da an bedeutungslos sein? Es scheint, als müsste man ein Lambda verwenden, damit dies funktioniert.