Könnte jemand den Unterschied zwischen filter
und filter_by
Funktionen in SQLAlchemy erklären ? Welches soll ich verwenden?
python
sqlalchemy
bodacydo
quelle
quelle
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.type(model.column_name == 'asdf')
→sqlalchemy.sql.elements.BinaryExpression
.filter
. eine Abfrage wieid=12345
,query(users).filter(id == id)
wird nicht gefiltert werdenusers.id
. Stattdessen wird es bewerten ,id == id
wieTrue
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 zwischencolumn == expression
und hinwegkommenkeyword = expression
. Also haben wir sie aufgeteilt.quelle
column == expression
vs.keyword = expression
ist der entscheidende Punkt, um den Unterschied zwischenfilter
und zu machenfilter_by
. Vielen Dank!filter_by
könnte etwas schneller sein alsfilter
.filter_by
besteht darin, in der Lage zu sein, nur den Feldnamen für diese Klasse zu schreiben, ohne dass Fragen gestellt werden - währendflter
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ährendfilter
pythonische Filterargumente wiefilter(User.name=="john")
quelle
Es ist ein Syntaxzucker für schnelleres Schreiben von Abfragen. Seine Implementierung im Pseudocode:
Für UND können Sie einfach schreiben:
Übrigens
kann geschrieben werden als
Sie können das Objekt auch direkt per PK über die folgende
get
Methode abrufen :Bei Verwendung von
get
case ist es wichtig, dass das Objekt ohne Datenbankanforderung zurückgegeben werden kann, vonidentity map
der aus es als Cache verwendet werden kann (im Zusammenhang mit der Transaktion).quelle
users.filter
von vorheriger Antwort. Und vielleicht ist es meine Schuld :)query
Attribut ist query_property und es ist heutzutage ein ziemlich normaler Zucker