J'ai parcouru la documentation et je n'arrive pas à trouver comment faire une requête OR dans SQLAlchemy. Je veux juste faire cette requête.
SELECT address FROM addressbook WHERE city='boston' AND (lastname='bulger' OR firstname='whitey')
Devrait être quelque chose comme
addr = session.query(AddressBook).filter(City == "boston").filter(????)
python
sqlalchemy
Jiminy Cricket
la source
la source
filter(or_(User.name == v for v in ('Alice', 'Bob', 'Carl')))
in_
opérateur comme celui-ci:filter(User.name.in_(['Alice', 'Bob', 'Carl']))
SQLAlchemy surcharge les opérateurs de bits
&
,|
et~
donc au lieu de la syntaxe de préfixe laide et difficile à lire avecor_()
etand_()
(comme dans la réponse de Bastien ), vous pouvez utiliser ces opérateurs:Notez que les parenthèses ne sont pas facultatives en raison de la priorité des opérateurs de bits.
Ainsi, toute votre requête pourrait ressembler à ceci:
la source
&
entre eux et le premier (plutôt que d'utiliser un deuxièmefilter
appel) pour le même effet?or_()
La fonction peut être utile en cas de nombre inconnu de composants de requête OR.Par exemple, supposons que nous créons un service REST avec quelques filtres facultatifs, qui devrait renvoyer un enregistrement si l'un des filtres renvoie true. D'un autre côté, si le paramètre n'a pas été défini dans une requête, notre requête ne devrait pas changer. Sans
or_()
fonction, nous devons faire quelque chose comme ceci:Avec la
or_()
fonction, il peut être réécrit en:la source
Cela a été vraiment utile. Voici mon implémentation pour n'importe quelle table donnée:
la source