Класс async_sessionmaker
Класс async_sessionmaker создает фабрику
асинхронных сессий. Фабрика вызывается для
получения нового объекта AsyncSession,
через который выполняются запросы к базе данных.
Первым параметром класс принимает async-движок,
созданный функцией create_async_engine.
Параметр expire_on_commit управляет
сбросом состояния объектов после коммита,
а class_ позволяет подменить класс сессии
на собственный.
Синтаксис
async_sessionmaker(bind, [class_], [expire_on_commit])
Пример
Давайте создадим фабрику асинхронных сессий
для базы SQLite в памяти:
from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
session_factory = async_sessionmaker(engine)
print(session_factory)
Результат выполнения кода:
"async_sessionmaker(class_=AsyncSession, expire_on_commit=True)"
Пример
Давайте создадим сессию через фабрику и выполним простой запрос:
import asyncio
from sqlalchemy import text
from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
session_factory = async_sessionmaker(engine)
async def main():
async with session_factory() as session:
res = await session.execute(text('SELECT 1'))
print(res.scalar())
asyncio.run(main())
Результат выполнения кода:
"1"
Пример
Давайте отключим параметр expire_on_commit,
чтобы объекты сохраняли данные после коммита:
Результат выполнения кода:
"False"
Пример
Давайте рассмотрим работу с моделью через
асинхронную сессию. Создадим таблицу
articles и добавим запись:
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
text: Mapped[str]
status: Mapped[str]
num: Mapped[int]
import asyncio
from sqlalchemy import select
from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker
from models import Base, Article
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
session_factory = async_sessionmaker(engine, expire_on_commit=False)
async def main():
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
async with session_factory() as session:
article = Article(
title='article',
text='sqlite:///:memory:',
status='user',
num=1,
)
session.add(article)
await session.commit()
res = await session.execute(select(Article))
for row in res.scalars():
print(row.title, row.num)
asyncio.run(main())
Результат выполнения кода:
"article 1"
Смотрите также
-
класс
async_sessionmaker,
который представляет фабрику асинхронных сессий -
метод
begin,
который открывает транзакцию на фабрике сессий -
метод
configure,
который меняет настройки фабрики сессий -
функцию
async_sessionmaker,
которая создает сессии для async-движка