Метод begin класса Session
Метод begin класса Session начинает
новую транзакцию. Он возвращает объект
SessionTransaction, который можно использовать
как контекстный менеджер. При входе в блок
with транзакция стартует, а при выходе
автоматически вызывается commit при успехе
или rollback при исключении.
Синтаксис
Session.begin()
Пример
Давайте создадим сессию и явно начнем
транзакцию через метод begin:
from sqlalchemy import create_engine, text
from sqlalchemy.orm import Session
engine = create_engine('sqlite:///:memory:')
with Session(engine) as session:
trans = session.begin()
print(trans)
session.execute(text('SELECT 1'))
trans.commit()
Результат выполнения кода:
"<sqlalchemy.orm.session.SessionTransaction object at 0x...>"
Пример
Чаще всего метод begin используется
как контекстный менеджер. Давайте выполним
вставку данных внутри транзакции:
from sqlalchemy import create_engine, text
from sqlalchemy.orm import Session
engine = create_engine('sqlite:///:memory:')
with Session(engine) as session:
session.execute(text('CREATE TABLE articles (id INTEGER, title TEXT)'))
with session.begin():
session.execute(
text('INSERT INTO articles (id, title) VALUES (:id, :title)'),
{'id': 1, 'title': 'article'}
)
res = session.execute(text('SELECT title FROM articles')).scalars().all()
print(res)
Результат выполнения кода:
['article']
Пример
Если внутри блока with session.begin
произойдет исключение, транзакция автоматически
откатится. Давайте проверим это:
from sqlalchemy import create_engine, text
from sqlalchemy.orm import Session
engine = create_engine('sqlite:///:memory:')
with Session(engine) as session:
session.execute(text('CREATE TABLE articles (id INTEGER, title TEXT)'))
try:
with session.begin():
session.execute(
text('INSERT INTO articles (id, title) VALUES (:id, :title)'),
{'id': 1, 'title': 'article'}
)
raise ValueError('something went wrong')
except ValueError as exc:
print(exc)
res = session.execute(text('SELECT title FROM articles')).scalars().all()
print(res)
Результат выполнения кода:
something went wrong
[]
Смотрите также
-
класс
Session,
который представляет сессию работы с базой -
метод
commit,
который фиксирует текущую транзакцию -
метод
rollback,
который откатывает текущую транзакцию -
метод
begin_nested,
который начинает вложенную транзакцию через SAVEPOINT