Сессии и их жизненный цикл в SQLAlchemy ORM

Сессии и их жизненный цикл в SQLAlchemy ORM

Одним из ключевых элементов SQLAlchemy ORM являются сессии, которые представляют собой "рабочую зону" для всех операций с базой данных. Данная статья призвана глубже погрузить вас в понимание того, как работают сессии и как управлять их жизненным циклом.

Что такое сессия

Сессия — это временная область, в которой происходит вся работа с объектами. Каждая сессия связана с базой данных и представляет собой по сути "разговор" с базой данных. Через сессию проходят все запросы, изменения данных и транзакции.

Создание сессии

Создание сессии начинается с определения фабрики сессий:

from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)

Теперь, чтобы начать разговор с базой данных, вы создаете экземпляр этой сессии:

session = Session()

Жизненный цикл сессии

Сессия проходит несколько этапов в своем жизненном цикле:

  • Открытие: Этап, на котором вы создаете новую сессию.
  • Вставка данных: Вы можете добавлять новые объекты в сессию с помощью метода add().
  • Запросы: Вы можете запросить данные из базы, используя различные методы, такие как query().
  • Изменение данных: Объекты, загруженные в сессию, могут быть изменены. Эти изменения будут отслеживаться.
  • Фиксация: Чтобы сохранить все изменения в базе данных, используется метод commit().
  • Откат: Если вы хотите отменить все неподтвержденные изменения, используйте метод rollback().
  • Закрытие: После завершения работы с сессией ее следует закрыть с помощью метода close().

Состояния объектов в сессии

Объекты внутри сессии могут находиться в разных состояниях:

  • Transient: Объект был создан, но еще не связан с сессией и не представлен в базе данных.
  • Pending: Объект добавлен в сессию, но еще не сохранен в базе данных.
  • Persistent: Объект сохранен в базе данных и связан с сессией.
  • Detached: Объект был связан с сессией, но впоследствии был отсоединен от нее.

Советы по управлению сессией

  • Всегда закрывайте сессию после завершения работы с ней.
  • Используйте контекстные сессии или менеджеры контекста для автоматического закрытия сессий.
  • В случае ошибки в транзакции всегда вызывайте rollback(), чтобы вернуть базу данных в предыдущее состояние.

Примеры работы с сессиями в SQLAlchemy ORM

Подготовка
Прежде всего, убедимся, что у нас есть база данных и определены модели:

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    
    id = Column(Integer, primary_key=True)
    name = Column(String)

engine = create_engine('sqlite:///mydatabase.db')

Base.metadata.create_all(engine)

Создание сессии

Session = sessionmaker(bind=engine)
session = Session()

Вставка данных

new_user = User(name="John Doe")
session.add(new_user)

Запросы

users = session.query(User).all()
for user in users:
    print(user.name)

Изменение данных

user_to_update = session.query(User).filter_by(name="John Doe").first()
user_to_update.name = "Johnathan Doe"

Фиксация

session.commit()

Откат
Допустим, мы сделали изменение, которое хотим отменить:

user_to_update = session.query(User).filter_by(name="Johnathan Doe").first()
user_to_update.name = "Johnny Doe"
session.rollback()

В этом примере мы изменили имя, но затем решили это отменить. После отката имя пользователя останется "Johnathan Doe".

Закрытие

session.close()

Заключение

Через этот набор простых примеров мы рассмотрели основные этапы жизненного цикла сессии SQLAlchemy ORM. Главное помнить, что сессия представляет собой мост между вашим кодом и базой данных. Эффективное управление сессией обеспечивает гладкое взаимодействие и предотвращает потенциальные ошибки.

Содержание: