Метод 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