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))
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.
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.
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)
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