Générer dynamiquement un filtre sqlalchemy en fonction des conditions

Aperçu

J'ai vu l'implémentation suivante en utilisant sqlalchemy. C'est une méthode qui ne fait une différence qu'entre la réduction à partir de la liste d'utilisateurs passée ou la réduction à partir de la table entière. (Les autres conditions sont exactement les mêmes) J'ai pensé qu'il serait préférable de le rendre commun lors de l'examen de la correction, alors j'ai étudié la solution.

def get_specified_age_users_from_user_list(user_name_list={}, age):
    """
Obtenir des utilisateurs d'un âge spécifique de la table User parmi les utilisateurs spécifiés
    """
    users = session.query(User).\
        filter(users.age==age).\
        filter(users.name.in_(user_name_list)).\
        all()
    return users

def get_specified_age_users(age):
    """
Obtenir des utilisateurs d'un âge spécifique à partir du tableau des utilisateurs
    """
    users = session.query(User).\
        filter(users.age==age).\
        all()
    return users

Solution

Passez la condition au format tuple à la méthode ʻand_`.

from sqlalchemy import and_

def get_specified_age_users(user_name_list={}, age):
    filters = []
    #Ajouter une condition uniquement si l'argument est passé
    if user_name_list:
        filters.append(User.name.in_(user_name_list))
    # and_L'argument de est tuple car il doit être tuple
    users = session.query(User).\
        filter(and_(*filters)).\
        all()
    return users

#SQL à exécuter
##Si spécifié
SELECT omis
FROM users 
WHERE users.name IN (%s)

##Si non spécifié
SELECT omis
FROM users 

Recommended Posts

Générer dynamiquement un filtre sqlalchemy en fonction des conditions
Point selon l'image
Constantes Python comme None (selon la référence)
Pour remplacer dynamiquement la méthode suivante en python
Comment lire les définitions de table générées dynamiquement à l'aide de SQL Alchemy
[Blender] Comment définir dynamiquement les sélections EnumProperty
Coloration des points en fonction de la distance de la courbe de régression
La musique de fond est automatiquement sélectionnée en fonction du contenu de la conversation