Метод commit класса SessionTransaction
Метод commit класса SessionTransaction
завершает текущую транзакцию и сохраняет все
изменения, накопленные в сессии, в базе данных.
Он не принимает параметров и вызывается у объекта
транзакции, полученного через метод begin
сессии или через контекстный менеджер.
Синтаксис
transaction.commit()
Пример
Давайте создадим таблицу, добавим запись и
зафиксируем транзакцию методом commit:
from sqlalchemy import create_engine, text
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
with session.begin() as transaction:
article = Article(title='article')
session.add(article)
transaction.commit()
res = session.execute(text('SELECT title FROM articles')).all()
print(res)
Результат выполнения кода:
[('article',)]
Пример
Давайте выполним две отдельные транзакции и
зафиксируем каждую методом commit:
from sqlalchemy import create_engine, text
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
transaction = session.begin()
session.add(Article(title='article 1'))
transaction.commit()
transaction = session.begin()
session.add(Article(title='article 2'))
transaction.commit()
res = session.execute(text('SELECT title FROM articles')).all()
print(res)
Результат выполнения кода:
[('article 1',), ('article 2',)]
Пример
Давайте обновим запись внутри транзакции и
зафиксируем изменение методом commit:
from sqlalchemy import create_engine, text
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
with session.begin() as transaction:
session.add(Article(title='article'))
transaction.commit()
with session.begin() as transaction:
article_id = session.execute(
text('SELECT id FROM articles')
).scalar_one()
session.execute(
text('UPDATE articles SET title = :title WHERE id = :id'),
{'title': 'updated article', 'id': article_id}
)
transaction.commit()
res = session.execute(text('SELECT title FROM articles')).all()
print(res)
Результат выполнения кода:
[('updated article',)]
Смотрите также
-
класс
SessionTransaction,
который представляет транзакцию сессии -
метод
rollback,
который откатывает текущую транзакцию -
метод
close,
который закрывает транзакцию без фиксации -
метод
commit,
который фиксирует изменения транзакции