[PYTHON] Umgang mit Sitzungen in SQLAlchemy

Einführung

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

Schlechte Behandlung der Sitzung

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.

Guter Weg, um Sitzung 1 zu behandeln

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.

Gute Möglichkeit, Sitzung 2 zu handhaben

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)

Verweise

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

Umgang mit Sitzungen in SQLAlchemy
Umgang mit Japanisch mit Python
Umgang mit aufeinanderfolgenden Werten in MySQL
Wie man mit dem Datum / Uhrzeit-Typ in Pythons SQLite3 umgeht
Wie aktualisiere ich mit SQLAlchemy?
Wie mit SQLAlchemy ändern?
Wie man in Python entwickelt
Umgang mit Datenrahmen
Wie lösche ich mit SQLAlchemy?
So führen Sie das Lernen mit SageMaker ohne Sitzungszeitlimit durch
Umgang mit JSON in Ruby, Python, JavaScript, PHP
[Python] Wie man PCA mit Python macht
Verwendung von Klassen in Theano
Wie man nüchtern mit Pandas schreibt
So sammeln Sie Bilder in Python
So aktualisieren Sie Spyder in Anaconda
Verwendung von SQLite in Python
So konvertieren Sie 0,5 in 1056964608 auf einmal
Wie man CSS in Django reflektiert
Wie man Prozesse in großen Mengen abbricht
Wie man MySQL mit Python benutzt
So verpacken Sie C in Python
Verwendung von ChemSpider in Python
Verwendung von PubChem mit Python
[Blender] Umgang mit Maus- und Tastaturereignissen in Blender-Skripten
So führen Sie TensorFlow 1.0-Code in 2.0 aus
So verbinden Sie INNER mit SQL Alchemy
So melden Sie sich bei Docker + NGINX an
So suchen Sie nach einer Zeichenfolge, um json_contains von mysql in SQL Alchemy zu verwenden
So rufen Sie PyTorch in Julia an
<Pandas> Umgang mit Zeitreihendaten in der Pivot-Tabelle
Verwendung berechneter Spalten in CASTable
[Einführung in Python] Wie verwende ich eine Klasse in Python?
So unterdrücken Sie Anzeigefehler in matplotlib
So erhalten Sie die Eltern-ID mit sqlalchemy
Dynamisches Definieren von Variablen in Python
So machen Sie R chartr () in Python
So konvertieren Sie csv in tsv in CLI
So löschen Sie abgelaufene Sitzungen in Django
[Itertools.permutations] So löschen Sie eine Sequenz in Python
Verwendung von Google Test in C-Sprache
So implementieren Sie einen verschachtelten Serializer mit drf-flex-Feldern
So arbeiten Sie mit BigQuery in Python
So führen Sie Befehle mit einem Jupyter-Notebook aus
Wie man in GitPython '--gags fetch --tags' macht
Wie bekomme ich Stacktrace in Python?
So zeigen Sie die neunundneunzig Tabelle in Python an
So extrahieren Sie einen Polygonbereich in Python
So weisen Sie den Index im Pandas-Datenrahmen neu zu
So überprüfen Sie die Version von opencv mit Python
So aktivieren Sie SSL (TLS) in Apache
Verwendung von Anacondas Interpreter mit PyCharm
So legen Sie ein nicht geprüftes Ziel in Flake8 fest
So wechseln Sie die Python-Version in Cloud9
So passen Sie den Bildkontrast in Python an
Verwendung von __slots__ in der Python-Klasse
So füllen Sie mit Python dynamisch Nullen aus
So führen Sie vom Server gesendete Ereignisse in Django durch
Verwendung regulärer Ausdrücke in Python