[PYTHON] Comment gérer une session dans SQLAlchemy

introduction

Dans SQLAlchemy, après avoir créé une session, il est nécessaire d'exécuter «commit ()», «rollback ()» et «close ()» selon les besoins. Ici, nous allons créer une classe qui effectue des opérations de base de données et résumer comment passer des sessions. Dans ce qui suit, on suppose que la classe de modèle suivante existe.

models.py


class User(Base):
    __tablename__="user" #Spécifiez le nom de la table
    id=Column(Integer, primary_key=True)
    first_name=Column(String(255))
    last_name=Column(String(255))

Mauvais traitement de session

Il n'est pas bon de faire comme le code source suivant.

wrong_way.py


from models import User

class FirstName(object):
    def update_first_name(self, user_id, first_name):
        session=Session()
        try:
            user=session.query(User).filter(User.id==user_id).one() #id=user_Extraire l'objet qui est id
            user.first_name=first_name #first_Changer de nom
            session.commit()
        except:
            session.rollback()
            raise


class LastName(object):
    def update_last_name(self, user_id, last_name):
        session=Session()
        try:
            user=session.query(User).filter(User.id==user_id).one() #id=user_Extraire l'objet qui est id
            user.first_name=first_name #last_Changer de nom
            session.commit()
        except:
            session.rollback()
            raise


def run_my_program():
    FirstName().update_first_name(1, "update_first_name")
    LastName().update_last_name(1, "update_last_name")

Parce que la même session n'est pas utilisée dans ʻupdate_first_name et ʻupdate_last_name dans run_my_program. "First_name a été mis à jour, mais last_name n'a pas été mis à jour" C'est parce que quelque chose comme ça se produit.

Bon moyen de gérer la session 1

Par conséquent, il peut être résolu en utilisant le code source suivant.

right_way_1.py


from models import User

class FirstName(object):
    def update_first_name(self, user_id, first_name, session):
        user=session.query(User).filter(User.id==user_id).one()
        user.first_name=first_name


class LastName(object):
    def update_last_name(self, user_id, last_name, session):
        user=session.query(User).filter(User.id==user_id).one()
        user.first_name=first_name


def run_my_program():
    session = Session()
    try:
        FirstName().update_first_name(session)
        LastName().update_last_name(session)
        session.commit()
    except:
        session.rollback()
        raise
    finally:
        session.close()

En faisant cela, la même session sera utilisée pour ʻupdate_first_name et ʻupdate_last_name. "Un seul a réussi" La situation comme celle-ci ne se produit pas.

Bon moyen de gérer la session 2

Ensuite, nous présenterons comment gérer les sessions à l'aide du gestionnaire de contexte. Quant au gestionnaire de contexte, l'article suivant est très facile à comprendre et utile, l'explication est donc omise ici. Qu'est-ce qu'un gestionnaire de contexte Python? L'histoire sur laquelle j'ai enquêté avec la pensée

right_way_2.py


from models import User

from contextlib import contextmanager

@contextmanager
def session_scope():
    session = Session()  # def __enter__
    try:
        yield session  #Passer la session avec comme
        session.commit()  #Si rien ne se passe, engagez-vous()
    except:
        session.rollback()  #Restauration en cas d'erreur()
        raise
    finally:
        session.close()  #De toute façon, il finira par se fermer()


class FirstName(object):
    def update_first_name(self, user_id, first_name, session):
        user=session.query(User).filter(User.id==user_id).one()
        user.first_name=first_name


class LastName(object):
    def update_last_name(self, user_id, last_name, session):
        user=session.query(User).filter(User.id==user_id).one()
        user.first_name=first_name


def run_my_program():
    with session_scope() as session:
        FirstName().update_first_name(session)
        LastName().update_last_name(session)

Les références

Cet article a été rédigé en référence aux informations suivantes. ・ Document officiel (notions de base de la session) · [Qu'est-ce qu'un gestionnaire de contexte Python? L'histoire sur laquelle j'ai enquêté (https://blog.mtb-production.info/entry/2018/04/10/183000)

Recommended Posts

Comment gérer une session dans SQLAlchemy
Comment gérer le japonais avec Python
Comment gérer des valeurs consécutives dans MySQL
Comment gérer le type datetime dans sqlite3 de python
Comment mettre à jour avec SQLAlchemy?
Comment modifier avec SQLAlchemy?
Comment développer en Python
Comment gérer les trames de données
Comment supprimer avec SQLAlchemy?
Comment effectuer un apprentissage avec SageMaker sans délai d'expiration de session
Comment gérer JSON en Ruby, Python, JavaScript, PHP
[Python] Comment faire PCA avec Python
Comment utiliser les classes dans Theano
Comment écrire sobrement avec des pandas
Comment collecter des images en Python
Comment mettre à jour Spyder dans Anaconda
Comment utiliser SQLite en Python
Comment convertir 0,5 en 1056964608 en un seul coup
Comment refléter CSS dans Django
Comment tuer des processus en vrac
Comment utiliser Mysql avec python
Comment envelopper C en Python
Comment utiliser ChemSpider en Python
Comment utiliser PubChem avec Python
[Blender] Comment gérer les événements de souris et de clavier dans les scripts Blender
Comment exécuter du code TensorFlow 1.0 en 2.0
Comment INNER JOIN avec SQL Alchemy
Comment se connecter à Docker + NGINX
Comment rechercher par chaîne pour utiliser les json_contains de mysql dans SQL Alchemy
Comment appeler PyTorch dans Julia
<Pandas> Comment gérer les données de séries chronologiques dans le tableau croisé dynamique
Comment utiliser les colonnes calculées dans CASTable
[Introduction à Python] Comment utiliser la classe en Python?
Comment supprimer l'erreur d'affichage dans matplotlib
Comment obtenir l'identifiant du parent avec sqlalchemy
Comment définir dynamiquement des variables en Python
Comment faire R chartr () en Python
Comment convertir csv en tsv dans la CLI
Comment supprimer des sessions expirées dans Django
[Itertools.permutations] Comment créer une séquence en Python
Comment utiliser Google Test en langage C
Comment implémenter un sérialiseur imbriqué avec drf-flex-fields
Comment utiliser BigQuery en Python
Comment exécuter des commandes avec Jupyter Notebook
Comment faire 'git fetch --tags' dans GitPython
Comment obtenir stacktrace en python
Comment afficher la table quatre-vingt-dix-neuf en python
Comment extraire une zone de polygone en Python
Comment réattribuer un index dans pandas dataframe
Comment vérifier la version d'opencv avec python
Comment activer SSL (TLS) dans Apache
Comment utiliser l'interpréteur d'Anaconda avec PyCharm
Comment spécifier une cible non vérifiée dans Flake8
Comment changer de version de Python dans cloud9
Comment régler le contraste de l'image en Python
Comment utiliser __slots__ dans la classe Python
Comment remplir dynamiquement des zéros avec Python
Comment faire des événements envoyés par le serveur dans Django
Comment utiliser les expressions régulières en Python