Метод add класса AsyncSession
Метод add класса AsyncSession
добавляет переданный объект в сессию.
Объект попадает в список ожидающих
сохранения, но сам SQL-запрос вставки
не выполняется. Запись в базу данных
произойдет только после вызова метода
flush или commit.
Первым параметром метод принимает
экземпляр ORM-модели, который нужно
добавить в сессию.
Синтаксис
await session.add(instance)
Пример
Давайте создадим объект модели и добавим его в сессию. Для начала объявим модель:
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.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.orm import sessionmaker
from models import Base, Article
async def main():
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
async_session = sessionmaker(engine, class_=AsyncSession)
async with async_session() as session:
article = Article(
title='article',
text='some text',
status='draft',
num=1
)
session.add(article)
await session.commit()
print(article.id)
asyncio.run(main())
Результат выполнения кода:
1
Пример
Метод add можно вызывать несколько
раз для добавления нескольких объектов.
Проверим это на примере:
<+python+>
import asyncio
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.orm import sessionmaker
from sqlalchemy import select
from models import Base, Article
async def main():
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
async_session = sessionmaker(engine, class_=AsyncSession)
async with async_session() as session:
session.add(Article(title='article 1', text='text 1', status='draft', num=1))
session.add(Article(title='article 2', text='text 2', status='draft', num=2))
await session.commit()
res = await session.scalars(select(Article))
for article in res:
print(article.id, article.title)
asyncio.run(main())
<-python+>
Результат выполнения кода:
1 article 1
2 article 2
Смотрите также
-
класс
AsyncSession,
который представляет асинхронную сессию -
метод
add_all,
который добавляет в сессию несколько объектов сразу -
метод
flush,
который отправляет изменения в базу данных -
метод
commit,
который фиксирует транзакцию