Einführung einer guten Methode zur Verwaltung von DB-Verbindungen in Python

Einführung

Bei einem bestimmten OSS-Code sah etwas gut aus. Stellen Sie ihn daher bitte vor.

Code

Ein bestimmtes OSS ist Apache Airflow. Unter ihnen war airflow / utils / session.py ein gutes Gefühl.

einfache Erklärung

Zuerst von session.py.

import contextlib
from functools import wraps

from airflow import settings

# contextlib.Wenn Sie den Kontextmanager angeben, wird er automatisch mit mit geschlossen.
@contextlib.contextmanager
def create_session():
    """
    Contextmanager that will create and teardown a session.
    """
    session = settings.Session()
    try:
        yield session
        session.commit()
    except Exception:
        session.rollback()
        raise
    finally:
        session.close()

#Ich möchte Sitzung verwenden. Es ergänzt Sitzung gut, wenn es in der Funktion verwendet wird
def provide_session(func):
    """
    Function decorator that provides a session if it isn't provided.
    If you want to reuse a session or run the function as part of a
    database transaction, you pass it to the function, if not this wrapper
    will create one and close it for you.
    """
    @wraps(func)
    def wrapper(*args, **kwargs):
        arg_session = 'session'

        func_params = func.__code__.co_varnames
        session_in_args = arg_session in func_params and \
            func_params.index(arg_session) < len(args)
        session_in_kwargs = arg_session in kwargs
        #Wenn das Argument der Funktion eine Sitzung enthält, verwenden Sie sie. Wenn nicht, erstellen Sie sie
        if session_in_kwargs or session_in_args:
            return func(*args, **kwargs)
        else:
            with create_session() as session:
                kwargs[arg_session] = session
                return func(*args, **kwargs)

    return wrapper

Also der Code, der als nächstes verwendet werden soll. Airflow / models / baseoperator.py Zeile 940 /airflow/blob/master/airflow/models/baseoperator.py#L940)

@provide_session
def get_task_instances(self, start_date: Optional[datetime] = None,
                        end_date: Optional[datetime] = None,
                        session: Session = None) -> List[TaskInstance]:
    """
    Get a set of task instance related to this task for a specific date
    range.
    """
    end_date = end_date or timezone.utcnow()
    return session.query(TaskInstance)\
        .filter(TaskInstance.dag_id == self.dag_id)\
        .filter(TaskInstance.task_id == self.task_id)\
        .filter(TaskInstance.execution_date >= start_date)\
        .filter(TaskInstance.execution_date <= end_date)\
        .order_by(TaskInstance.execution_date)\
        .all()

Wenn Sie es als Dekorateur mit einer Funktion angeben, die "session" like verwendet Wenn im Anrufer keine "Sitzung" festgelegt ist, wird sie neu erstellt (und am Ende geschlossen). Wenn Sie "Sitzung" eingestellt haben, können Sie ein angenehmes Gefühl erzielen, wenn Sie es so verwenden, wie es ist.

Am Ende

Ich denke, diese Methode kann auf verschiedene andere Arten als die DB-Verbindung angewendet werden.

Referenz

Recommended Posts

Einführung einer guten Methode zur Verwaltung von DB-Verbindungen in Python
Eine clevere Möglichkeit zur Zeitverarbeitung mit Python
[Python] Verwalten Sie Funktionen in einer Liste
Eine einfache Möglichkeit, mehrere for-Schleifen in Python zu vermeiden
Eine Standardmethode zum Entwickeln und Verteilen von Paketen in Python
Wie bekomme ich Stacktrace in Python?
Einfache Möglichkeit, Wikipedia mit Python zu verwenden
Verwalten Sie Python-Pakete, um sie in Containern zu installieren
Berechnen wir das statistische Problem mit Python
So löschen Sie einen Taple in einer Liste (Python)
Einbetten von Variablen in Python-Strings
Ich möchte mit Python ein Fenster erstellen
So erstellen Sie eine JSON-Datei in Python
So fügen Sie Python ein Modul hinzu, das Sie in Julialang eingefügt haben
So benachrichtigen Sie Discord-Kanäle in Python
[Python] Wie zeichnet man mit Matplotlib ein Histogramm?
Tipps für eine gute Verwendung von Elastic Search
Auf der Suche nach einer effizienten Möglichkeit, eine Docker-Datei mit Python mit Gedichten zu schreiben
Einführung von Python 2.7 in CentOS 6.6
Analysieren Sie eine JSON-Zeichenfolge, die in eine Datei in Python geschrieben wurde
Ich möchte Timeout einfach in Python implementieren
Versuchen Sie, ein Python-Modul in C-Sprache zu erstellen
Ich möchte in Python schreiben! (2) Schreiben wir einen Test
Erstellen Sie ein Plug-In, das Python Doctest auf Vim ausführt (2)
Ich habe versucht, einen Pseudo-Pachislot in Python zu implementieren
Ein Memorandum zum Ausführen eines Python-Skripts in einer Bat-Datei
Ich möchte eine Datei mit Python zufällig testen
Ich möchte mit einem Roboter in Python arbeiten.
Beachten Sie beim Initialisieren einer Liste in Python
[Python] Erstellt eine Methode zum Konvertieren von Radix in 1 Sekunde
So führen Sie einen Befehl mit einem Unterprozess in Python aus
Es wurde eine Möglichkeit für UEFI behoben, Windows zum Booten zu zwingen
Veröffentlichen / Hochladen einer in Python erstellten Bibliothek in PyPI
[Mac] Eine supereinfache Möglichkeit, Systembefehle in Python auszuführen und die Ergebnisse auszugeben
Erstellen Sie eine Funktion in Python
So löschen Sie stdout in Python
Erstellen Sie ein Wörterbuch in Python
Ich habe versucht, einen eindimensionalen Zellautomaten in Python zu implementieren
So schneiden Sie ein Block-Multiple-Array aus einem Multiple-Array in Python
Ein Weg zum mittleren Python
Eine Geschichte darüber, wie man einen relativen Pfad in Python angibt.
Ändern Sie das Standardausgabeziel in eine Datei in Python
Melden Sie sich auf der Website in Python an
Wahrscheinlich der einfachste Weg, um mit Python 3 ein PDF zu erstellen
So importieren Sie Dateien in Python an eine beliebige Stelle
Entwickelte eine Bibliothek, um die Kindle-Sammlungsliste in Python abzurufen
So definieren Sie mehrere Variablen in einer Python for-Anweisung
Ich habe versucht "Wie man eine Methode in Python dekoriert"
So entwickeln Sie in einer virtuellen Python-Umgebung [Memo]
Erstellen Sie ein Lesezeichen in Python
So geben Sie char * in einer Rückruffunktion mit ctypes in Python zurück
So erhalten Sie den letzten (letzten) Wert in einer Liste in Python
So erhalten Sie eine Liste der integrierten Ausnahmen für Python
[Python] Verwalten Sie Funktionen, indem Sie sie in ein Wörterbuch einfügen (Befehlstabelle, Funktionstabelle, Funktionszeiger).
Einführung in Python in der Praxis (PiP)
[Python] Eine andere Möglichkeit zum Importieren
Ich habe eine Stoppuhr mit tkinter mit Python gemacht