РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
97 of 711 menu

Метод add_all

Метод add_all класса Session добавляет в сессию сразу несколько объектов - он принимает итерируемый набор экземпляров моделей и ставит их в очередь на сохранение. Метод не выполняет запрос к базе данных немедленно: объекты попадают в сессию и будут записаны при вызове flush или commit. Первым параметром метод принимает итерируемый объект с экземплярами моделей, например список.

Синтаксис

session.add_all(instances)

Пример

Давайте создадим несколько объектов модели Article и добавим их в сессию одним вызовом add_all:

from sqlalchemy import create_engine, String from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session 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(String(255)) engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: articles = [ Article(title='article 1', text='text 1'), Article(title='article 2', text='text 2'), Article(title='article 3', text='text 3'), ] session.add_all(articles) session.commit() res = session.query(Article).all() for article in res: print(article.id, article.title)

Результат выполнения кода:

1 article 1 2 article 2 3 article 3

Пример

Давайте добавим объекты через генератор и убедимся, что add_all принимает любой итерируемый объект:

from sqlalchemy import create_engine, String from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session class Base(DeclarativeBase): pass class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] = mapped_column(String(100)) status: Mapped[str] = mapped_column(String(50)) engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: articles = ( Article(title=f'article {num}', status='draft') for num in range(1, 4) ) session.add_all(articles) session.commit() res = session.query(Article).count() print(res)

Результат выполнения кода:

3

Пример

Давайте проверим, что объекты попадают в сессию, но не записываются в базу до вызова flush или commit:

from sqlalchemy import create_engine, String from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session class Base(DeclarativeBase): pass class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] = mapped_column(String(100)) engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: session.add_all([ Article(title='article 1'), Article(title='article 2'), ]) print('new:', len(session.new)) print('count before flush:', session.query(Article).count()) session.flush() print('count after flush:', session.query(Article).count()) session.commit()

Результат выполнения кода:

new: 2 count before flush: 0 count after flush: 2

Смотрите также

  • класс Session,
    который управляет жизненным циклом объектов
  • метод add,
    который добавляет один объект в сессию
  • метод flush,
    который записывает изменения в базу без commit
  • метод commit,
    который фиксирует транзакцию
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить