[PYTHON] Generieren Sie dynamisch einen SQLalchemiefilter entsprechend den Bedingungen

Überblick

Ich habe die folgende Implementierung mit sqlalchemy gesehen. Es ist eine Methode, die nur einen Unterschied zwischen der Eingrenzung von der Liste der übergebenen Benutzer oder der Eingrenzung von der gesamten Tabelle macht. (Andere Bedingungen sind genau die gleichen) Ich dachte, dass es besser wäre, es allgemein zu machen, wenn ich über die Korrektur nachdenke, also untersuchte ich die Lösung.

def get_specified_age_users_from_user_list(user_name_list={}, age):
    """
Rufen Sie Benutzer eines bestimmten Alters aus der Benutzertabelle unter den angegebenen Benutzern ab
    """
    users = session.query(User).\
        filter(users.age==age).\
        filter(users.name.in_(user_name_list)).\
        all()
    return users

def get_specified_age_users(age):
    """
Rufen Sie Benutzer eines bestimmten Alters aus der Benutzertabelle ab
    """
    users = session.query(User).\
        filter(users.age==age).\
        all()
    return users

Lösung

Übergeben Sie die Bedingung im Tupelformat an die Methode and and.

from sqlalchemy import and_

def get_specified_age_users(user_name_list={}, age):
    filters = []
    #Bedingung nur hinzufügen, wenn Argument übergeben wird
    if user_name_list:
        filters.append(User.name.in_(user_name_list))
    # and_Das Argument von ist Tupel, weil es Tupel sein muss
    users = session.query(User).\
        filter(and_(*filters)).\
        all()
    return users

#SQL ausgeführt werden
##Wenn angegeben
SELECT weggelassen
FROM users 
WHERE users.name IN (%s)

##Wenn nicht angegeben
SELECT weggelassen
FROM users 

Recommended Posts

Generieren Sie dynamisch einen SQLalchemiefilter entsprechend den Bedingungen
Punkt entsprechend dem Bild
Python-Konstanten wie None (laut Referenz)
Dynamisches Ersetzen der nächsten Methode in Python
Lesen dynamisch generierter Tabellendefinitionen mit SQL Alchemy
[Blender] So legen Sie die Auswahlelemente von EnumProperty dynamisch fest
Farbpunkte entsprechend dem Abstand von der Regressionskurve
BGM wird automatisch entsprechend dem Inhalt der Konversation ausgewählt