5.2 Подключение к базе данных используя SQLAlchemy
7 из 7 шагов пройдено
3 из 3 баллов  получено

Инициализация фабрики сеансов

Все 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, нам нужно создать уровень модели, используя базовый класс. Чем мы и займемся в следующем разделе.


Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Нет обсуждений. Начните первое.