In SQLAlchemy müssen nach dem Erstellen einer Sitzung nach Bedarf "commit ()", "rollback ()" und "close ()" ausgeführt werden. Hier erstellen wir eine Klasse, die DB-Operationen ausführt, und fassen zusammen, wie Sitzungen übergeben werden. Im Folgenden wird davon ausgegangen, dass die folgende Modellklasse vorhanden ist.
models.py
class User(Base):
__tablename__="user" #Geben Sie den Tabellennamen an
id=Column(Integer, primary_key=True)
first_name=Column(String(255))
last_name=Column(String(255))
Es ist nicht gut, es wie den folgenden Quellcode zu machen.
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_Extrahiere obj, das id ist
user.first_name=first_name #first_Namen ändern
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_Extrahiere obj, das id ist
user.first_name=first_name #last_Namen ändern
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")
Weil dieselbe Sitzung nicht in "update_first_name" und "update_last_name" in "run_my_program" verwendet wird. "Vorname wurde aktualisiert, aber Nachname wurde nicht aktualisiert" Das liegt daran, dass so etwas passiert.
Daher kann es mit dem folgenden Quellcode gelöst werden.
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()
Auf diese Weise wird dieselbe Sitzung für "update_first_name" und "update_last_name" verwendet. "Nur einer lief erfolgreich" Eine solche Situation tritt nicht auf.
Als nächstes werden wir vorstellen, wie Sitzungen mit dem Kontextmanager behandelt werden. Was den Kontextmanager betrifft, so ist der folgende Artikel sehr einfach zu verstehen und hilfreich, daher wird die Erklärung hier weggelassen. Was ist ein Python-Kontextmanager? Die Geschichte, nach der ich gesucht habe
right_way_2.py
from models import User
from contextlib import contextmanager
@contextmanager
def session_scope():
session = Session() # def __enter__
try:
yield session #Sitzung mit as bestehen
session.commit() #Wenn nichts passiert, legen Sie fest()
except:
session.rollback() #Rollback, wenn ein Fehler auftritt()
raise
finally:
session.close() #In jedem Fall wird es irgendwann geschlossen()
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)
Dieser Artikel wurde unter Bezugnahme auf die folgenden Informationen verfasst. ・ Offizielles Dokument (Sitzungsgrundlagen) · [Was ist ein Python-Kontextmanager? Die Geschichte, die ich untersucht habe (https://blog.mtb-production.info/entry/2018/04/10/183000)
Recommended Posts