Introduction d'une bonne méthode de gestion des connexions DB en Python

introduction

En regardant un certain code OSS, il y avait quelque chose qui semblait bon, alors veuillez le présenter.

code

Un certain OSS est Apache Airflow. Parmi eux, airflow / utils / session.py était un bon sentiment.

explication facile

Tout d'abord, à partir de session.py.

import contextlib
from functools import wraps

from airflow import settings

# contextlib.Si vous spécifiez contextmanager, il se fermera automatiquement en utilisant avec.
@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()

#Je veux utiliser Session Il complète bien Session lorsqu'il est utilisé en fonction
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
        #S'il y a une session dans l'argument de fonction, utilisez-la, sinon créez-la
        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

Donc, le code à utiliser ensuite. Ligne 940 de airflow / models / baseoperator.py /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()

Si vous le spécifiez en tant que décorateur avec une fonction qui utilise session comme Si session n'est pas définie dans l'appelant, elle sera nouvellement créée (et sera fermée à la fin). Si vous avez défini session, vous pouvez obtenir une agréable sensation de l'utiliser telle quelle.

À la fin

Je pense que cette méthode peut être appliquée de différentes manières autres que la connexion DB.

référence

Recommended Posts

Introduction d'une bonne méthode de gestion des connexions DB en Python
Une manière intelligente de chronométrer le traitement avec Python
[python] Gérer les fonctions dans une liste
Un moyen simple d'éviter plusieurs boucles for en Python
Un moyen standard de développer et de distribuer des packages en Python
Comment obtenir stacktrace en python
Un moyen simple d'utiliser Wikipedia avec Python
Gérer les packages python à installer dans des conteneurs
Calculons en fait le problème statistique avec Python
Comment effacer un taple dans une liste (Python)
Comment incorporer des variables dans des chaînes python
Je veux créer une fenêtre avec Python
Comment créer un fichier JSON en Python
Pour ajouter un module à python que vous mettez dans Julialang
Comment notifier les canaux Discord en Python
[Python] Comment dessiner un histogramme avec Matplotlib
Conseils pour utiliser Elastic Search de manière efficace
Recherche d'un moyen efficace d'écrire un Dockerfile avec Python avec de la poésie
Introduction de Python 2.7 à CentOS 6.6
Analyser une chaîne JSON écrite dans un fichier en Python
Je veux facilement implémenter le délai d'expiration en python
Essayez de créer un module Python en langage C
Je veux écrire en Python! (2) Écrivons un test
Créer un plugin pour exécuter Python Doctest sur Vim (2)
J'ai essayé d'implémenter un pseudo pachislot en Python
Un mémorandum pour exécuter un script python dans un fichier bat
Je veux échantillonner au hasard un fichier avec Python
Je veux travailler avec un robot en python.
Choses à noter lors de l'initialisation d'une liste en Python
[Python] Création d'une méthode pour convertir la base en 1 seconde
Comment exécuter une commande à l'aide d'un sous-processus en Python
Correction d'un moyen pour l'UEFI de forcer Windows à démarrer
Publier / télécharger une bibliothèque créée en Python vers PyPI
[Mac] Un moyen très simple d'exécuter des commandes système en Python et de générer les résultats
Créer une fonction en Python
Pour vider stdout en Python
Créer un dictionnaire en Python
J'ai essayé d'implémenter un automate cellulaire unidimensionnel en Python
Comment découper un bloc de plusieurs tableaux à partir d'un multiple en Python
Une route vers Python intermédiaire
Une histoire sur la façon de spécifier un chemin relatif en python.
Changer la destination de sortie standard en un fichier en Python
Connectez-vous au site Web en Python
Probablement le moyen le plus simple de créer un pdf avec Python 3
Comment importer des fichiers où vous le souhaitez en Python
Développer une bibliothèque pour obtenir la liste des collections Kindle en Python
Comment définir plusieurs variables dans une instruction Python for
J'ai essayé "Comment obtenir une méthode décorée en Python"
Comment développer dans un environnement virtuel Python [Memo]
Créer un bookmarklet en Python
Pour renvoyer char * dans une fonction de rappel à l'aide de ctypes en Python
Comment obtenir la dernière (dernière) valeur d'une liste en Python
Comment obtenir une liste d'exceptions intégrées pour python
[python] Gérer les fonctions en les mettant dans un dictionnaire (table de commande, table de fonction, pointeur de fonction)
Présentation de Python en pratique (PiP)
[Python] Une autre façon d'importer
J'ai fait un chronomètre en utilisant tkinter avec python