Réponses:
filter_by
est utilisé pour les requêtes simples sur les noms de colonnes en utilisant des kwargs normaux, comme
db.users.filter_by(name='Joe')
La même chose peut être accomplie avec filter
, sans utiliser kwargs, mais à la place en utilisant l'opérateur d'égalité '==', qui a été surchargé sur l'objet db.users.name:
db.users.filter(db.users.name=='Joe')
Vous pouvez également écrire des requêtes plus puissantes à l'aide filter
, telles que des expressions comme:
db.users.filter(or_(db.users.name=='Ryan', db.users.country=='England'))
type(model.column_name == 'asdf')
→sqlalchemy.sql.elements.BinaryExpression
.filter
. une requête comme id=12345
, query(users).filter(id == id)
ne filtrera pas users.id
. Au lieu de cela, il évaluera id == id
aussi True
et retourner tous les utilisateurs. Vous devez utiliser .filter(users.id == id)
(comme démontré ci-dessus). J'ai fait cette erreur un peu plus tôt dans la journée.
En fait, nous les avons fusionnés à l'origine, c'est-à-dire qu'il y avait une méthode de type "filtre" qui acceptait *args
et **kwargs
, où vous pouviez passer une expression SQL ou des arguments de mots clés (ou les deux). En fait, je trouve cela beaucoup plus pratique, mais les gens ont toujours été confus, car ils surmontent généralement la différence entre column == expression
et keyword = expression
. Nous les avons donc séparés.
column == expression
vs keyword = expression
est le point clé à faire sur la différence entre filter
et filter_by
. Merci!
filter_by
pourrait être un peu plus rapide que filter
.
filter_by
est de pouvoir écrire dans le nom du champ, pour cette classe, aucune question n'est posée - alors que flter
nécessite l'objet de colonne réel - qui nécessite généralement de taper (et de lire) au moins un nom de classe redondant. Donc, si l'on veut filtrer par égalité, c'est plutôt pratique.
filter_by
utilise des arguments de mot-clé, tandis que filter
permet des arguments de filtrage pythonique commefilter(User.name=="john")
C'est un sucre de syntaxe pour une écriture de requête plus rapide. Son implémentation en pseudocode:
def filter_by(self, **kwargs):
return self.filter(sql.and_(**kwargs))
Pour ET, vous pouvez simplement écrire:
session.query(db.users).filter_by(name='Joe', surname='Dodson')
btw
session.query(db.users).filter(or_(db.users.name=='Ryan', db.users.country=='England'))
peut s'écrire
session.query(db.users).filter((db.users.name=='Ryan') | (db.users.country=='England'))
Vous pouvez également obtenir un objet directement par PK via la get
méthode:
Users.query.get(123)
# And even by a composite PK
Users.query.get(123, 321)
Lors de l'utilisation de la get
casse, il est important que l'objet puisse être renvoyé sans demande de base de données à partir de identity map
laquelle peut être utilisé comme cache (associé à la transaction)
users.filter
de la réponse précédente. Et c'est peut-être de ma faute :) l' query
attribut est query_property et c'est un sucre assez standard de nos jours
db.users.name=='Ryan'
une fois à une constante et serait alors vide de sens à partir de là? Il semble que l'on aurait besoin d'utiliser un lambda pour que cela fonctionne.