Метод add класса Session
Метод add класса Session добавляет
объект в сессию. Первым параметром метод принимает
экземпляр модели, который нужно поставить в очередь
на сохранение. Объект попадает в состояние pending
и будет записан в базу данных при следующем
flush или commit.
Если объект уже присутствует в сессии, повторный
вызов add не создает дубликат, а просто
возвращает его из карты идентичности. Метод
возвращает None и не выполняет SQL-запрос
немедленно.
Синтаксис
Session.add(instance)
Пример
Давайте создадим модель и добавим один объект в сессию:
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(500))
status: Mapped[str] = mapped_column(String(50))
num: Mapped[int]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(
title='article',
text='some text',
status='draft',
num=1
)
session.add(article)
session.commit()
print(article.id)
Результат выполнения кода:
"1"
Пример
Давайте добавим несколько объектов по одному
через add:
from sqlalchemy import create_engine, String, select
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(500))
status: Mapped[str] = mapped_column(String(50))
num: Mapped[int]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add(Article(
title='article 1',
text='first text',
status='draft',
num=1
))
session.add(Article(
title='article 2',
text='second text',
status='published',
num=2
))
session.add(Article(
title='article 3',
text='third text',
status='draft',
num=3
))
session.commit()
res = session.scalars(select(Article)).all()
print([a.title for a in res])
Результат выполнения кода:
['article 1', 'article 2', 'article 3']
Пример
Давайте убедимся, что повторный вызов add
для одного объекта не создает дубликат:
from sqlalchemy import create_engine, String, select, func
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(500))
status: Mapped[str] = mapped_column(String(50))
num: Mapped[int]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(
title='article',
text='some text',
status='draft',
num=1
)
session.add(article)
session.add(article)
session.commit()
count = session.scalar(select(func.count()).select_from(Article))
print(count)
Результат выполнения кода:
"1"