Начиная с версии 1.4, SQLAlchemy поддерживает функции асинхронного ввода-вывода (AsyncIO), что обеспечивает поддержку асинхронных соединений, сеансов, транзакций и драйверов базы данных. Большинство процедур создания такие же, как и для синхронной работы.
Установка драйверов базы данных, совместимых с asyncio
Прежде чем мы начнем настройку конфигурации базы данных, нам необходимо установить следующие асинхронно-совместимые драйверы, в нашем случае это асинхронный драйвер для работы с PostgreSQL.
pip install asyncpg
Другие драйвера мы рассматривали в этом разделе.
Настройка подключения к базе данных
После установки необходимых драйверов мы можем получить ядро базы данных с помощью метода create_async_engine() приложения, который создает асинхронную версию механизма SQLAlchemy, известную как AsyncEngine.
Кроме того, у него также есть параметр echo, который может предоставить нам сгенерированные SQL-запросы в консоли сервера во время выполнения. Но наиболее важным является URL-адрес базы данных, который теперь отражает асинхронный доступ к базе данных посредством вызова протокола asyncpg.
Откроем файл backend/db.py и изменим настройки подключения к базе данных:
from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker, AsyncSession
from sqlalchemy.orm import DeclarativeBase
engine = create_async_engine('postgresql+asyncpg://ecommerce:xxxxxx@localhost:5432/ecommerce', echo=True)
async_session_maker = async_sessionmaker(engine, expire_on_commit=False, class_=AsyncSession)
class Base(DeclarativeBase):
pass
Синтаксис подключения выглядит следующим образом:
myusername:mypassword@myhost:5432/mydatabase
Как и в синхронной версии, директива sessionmaker() используется для создания фабрики сессий с некоторыми новыми параметрами, установленными для включения AsyncSession. Во-первых, для его параметра expire_ on _ commit установлено значение False, чтобы экземпляры этой модели и значения ее атрибутов были доступны на время транзакции, даже после вызова commit().
В отличие от синхронной среды, все классы сущностей и их объекты столбцов по-прежнему доступны другим процессам даже после фиксации транзакции. Затем его параметр class_ будет иметь имя класса AsyncSession, объекта, который будет управлять транзакциями.