Метод add_all класса AsyncSession
Метод add_all класса AsyncSession добавляет
в сессию сразу несколько ORM-объектов. Первым параметром
метод принимает итерируемый объект с экземплярами моделей,
например список. Объекты попадают в сессию и будут
сохранены в базу данных при следующем flush или
commit.
Метод является асинхронным, поэтому вызывается через
await. В отличие от метода add, который
принимает один объект, add_all удобен для массового
добавления записей одной операцией.
Синтаксис
await session.add_all(instances)
Пример
Давайте создадим несколько статей и добавим их в сессию
одним вызовом add_all:
import asyncio
from sqlalchemy import String, Text
from sqlalchemy.ext.asyncio import (
AsyncSession,
create_async_engine,
)
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] = mapped_column(String(100))
text: Mapped[str] = mapped_column(Text)
status: Mapped[str] = mapped_column(String(50))
num: Mapped[int]
async def main():
engine = create_async_engine('sqlite:///:memory:')
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
async with AsyncSession(engine) as session:
articles = [
Article(title='article 1', text='text 1', status='new', num=1),
Article(title='article 2', text='text 2', status='new', num=2),
Article(title='article 3', text='text 3', status='new', num=3),
]
await session.add_all(articles)
await session.commit()
print('added:', len(articles))
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
"added: 3"
Пример
Давайте проверим, что объекты действительно попали в базу,
прочитав их обратно через метод scalars:
import asyncio
from sqlalchemy import String, Text, select
from sqlalchemy.ext.asyncio import (
AsyncSession,
create_async_engine,
)
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] = mapped_column(String(100))
text: Mapped[str] = mapped_column(Text)
status: Mapped[str] = mapped_column(String(50))
num: Mapped[int]
async def main():
engine = create_async_engine('sqlite:///:memory:')
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
async with AsyncSession(engine) as session:
articles = [
Article(title='article 1', text='text 1', status='new', num=1),
Article(title='article 2', text='text 2', status='new', num=2),
]
await session.add_all(articles)
await session.commit()
res = await session.scalars(select(Article))
for article in res:
print(article.id, article.title)
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
1 article 1
2 article 2
Пример
Давайте передадим в add_all генераторное выражение
и убедимся, что метод принимает любой итерируемый объект:
import asyncio
from sqlalchemy import String, Text
from sqlalchemy.ext.asyncio import (
AsyncSession,
create_async_engine,
)
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] = mapped_column(String(100))
text: Mapped[str] = mapped_column(Text)
status: Mapped[str] = mapped_column(String(50))
num: Mapped[int]
async def main():
engine = create_async_engine('sqlite:///:memory:')
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
async with AsyncSession(engine) as session:
await session.add_all(
Article(
title=f'article {i}',
text=f'text {i}',
status='new',
num=i,
)
for i in range(1, 4)
)
await session.commit()
print('done')
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
"done"
Смотрите также
-
класс
AsyncSession,
который представляет асинхронную сессию -
метод
add,
который добавляет один объект в сессию -
метод
commit,
который фиксирует изменения в базе данных -
метод
scalars,
который выполняет запрос и возвращает объекты