Une main d'enfant sur celle d'un adulte

Bonne utilisation du “And” avec SQLAlchemy

Voici une nouvelle petite astuce pour tous ceux qui apprennent à utiliser SQLAlchemy.

Objectif

Pour construire cette instruction SQL :

1
2
3
4
5
SELECT * FROM event
WHERE
status IN ('NEW', 'TODO') AND
confirmed_at IS NULL AND
created_at <= p_cutoff_datetime

Comment ne pas écrire la requête SQLAlchemy

Vous ne devez pas déclarer votre requête SQLAlchemy de la façon suivante :

1
2
3
4
5
            query = session.query(EventEntity).filter(
                    EventEntity.status.in_(statuses),
                    EventEntity.confirmed_at == None,
                    EventEntity.created_at <= cutoff_datetime
            )

Il produira l’instruction SQL suivante :

1
2
3
SELECT * FROM event
WHERE
0 != 1 -- 🤔

Le 0 != 1 est la façon dont SQLAlchemy crée une condition qui renvoie toujours faux, et donc aucun résultat.

Bonne syntaxe

Au lieu de cela, utilisez SQLAlchemy comme ceci, en enveloppant vos conditions avec l’opérateur and_ :

1
2
3
4
5
6
7
8
9
            from sqlalchemy import and_

            query = session.query(EventEntity).filter(
                and_(
                    EventEntity.status.in_(statuses),
                    EventEntity.confirmed_at == None,
                    EventEntity.created_at <= cutoff_datetime
                )
            )

C’est tout pour cette fois !

Suivez-moi !

Merci d’avoir lu cet article. Assurez-vous de me suivre sur X, de vous abonner à ma publication Substack et d’ajouter mon blog à vos favoris pour ne pas manquer les prochains articles.

Photo de Juan Pablo Serrano