Quelqu'un pourrait-il expliquer la différence entre les fonctions filter
et filter_by
dans SQLAlchemy? Lequel devrais-je utiliser?
python
sqlalchemy
Bodacydo
la source
la source
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.type(model.column_name == 'asdf')
→sqlalchemy.sql.elements.BinaryExpression
.filter
. une requête commeid=12345
,query(users).filter(id == id)
ne filtrera pasusers.id
. Au lieu de cela, il évalueraid == id
aussiTrue
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 entrecolumn == expression
etkeyword = expression
. Nous les avons donc séparés.la source
column == expression
vskeyword = expression
est le point clé à faire sur la différence entrefilter
etfilter_by
. Merci!filter_by
pourrait être un peu plus rapide quefilter
.filter_by
est de pouvoir écrire dans le nom du champ, pour cette classe, aucune question n'est posée - alors queflter
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 quefilter
permet des arguments de filtrage pythonique commefilter(User.name=="john")
la source
C'est un sucre de syntaxe pour une écriture de requête plus rapide. Son implémentation en pseudocode:
Pour ET, vous pouvez simplement écrire:
btw
peut s'écrire
Vous pouvez également obtenir un objet directement par PK via la
get
méthode: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 deidentity map
laquelle peut être utilisé comme cache (associé à la transaction)la source
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