Инициализация фабрики сеансов
Все CRUD-транзакции в SQLAlchemy управляются сеансами. Каждый сеанс управляет группой операций «записи» и «чтения» базы данных и проверяет, выполнять их или нет.
Например, он поддерживает группу вставленных, обновленных и удаленных объектов, проверяет, являются ли изменения действительными, а затем координирует свои действия с ядром SQLAlchemy, чтобы внести изменения в базу данных, если все транзакции были проверены. Это соответствует поведению шаблона проектирования «Unit of Work».
SQLAlchemy использует сеансы для обеспечения согласованности и целостности данных. Подключимsessionmaker() из модуля sqlalchemy.orm, и напишем следующий код в файле db.py, в котором вызовем sessionmaker():
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker # New
engine = create_engine('sqlite:///ecommerce.db', echo=True)
SessionLocal = sessionmaker(bind=engine) # New
Приложения могут создавать более одного сеанса с помощью вызова SessionLocal, но рекомендуется иметь один сеанс для каждого APIRouter.
Определение базового класса
Далее нам нужно настроить базовый класс, который имеет решающее значение для сопоставления классов модели с таблицами базы данных. Теперь этот базовый класс должен быть подклассом классов модели, чтобы сопоставление с таблицами происходило после запуска сервера.
Для создания моделей необходима базовая модель, от которой потом наследуются остальные модели. Начиная с версии SQLAlchemy 2.0 для создания базовой модели надо создать класс, унаследованный от DeclarativeBase. Добавим следующий код в файл db.py нашего приложения:
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, DeclarativeBase # New
engine = create_engine('sqlite:///ecommerce.db', echo=True)
SessionLocal = sessionmaker(bind=engine)
class Base(DeclarativeBase): # New
pass
То есть в данном случае определяется класс Base - базовая модель.
Стоит отметить, что до версии SQLAlchemy 2.0 можно встретить другой способ - применение функции declarative_base():
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
Этот способ начиная с версии SQLAlchemy 2.0 объявлен устаревшим.
Обратите внимание, что все эти конфигурации являются частью модуля /backend/db.py. Они объединены в один модуль, поскольку они имеют решающее значение для создания репозитория SQLAlchemy. Но прежде чем мы реализуем транзакции CRUD, нам нужно создать уровень модели, используя базовый класс. Чем мы и займемся в следующем разделе.