Метод merge класса Session
Метод merge класса Session
объединяет состояние переданного объекта
с объектом, привязанным к текущей сессии.
Первым параметром метод принимает экземпляр
модели, состояние которого нужно перенести.
Метод возвращает новый экземпляр, связанный
с сессией, при этом исходный объект остается
без изменений. Если объект с таким первичным
ключом уже есть в сессии, он будет обновлен,
иначе будет создан новый.
Синтаксис
Session.merge(instance)
Пример
Давайте создадим объект вне сессии и
объединим его с сессией методом merge:
from sqlalchemy import create_engine, Integer, 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(50))
text: Mapped[str] = mapped_column(String(200))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
detached = Article(id=1, title='article', text='some text')
with Session(engine) as session:
merged = session.merge(detached)
print(merged is detached)
print(merged.title)
Результат выполнения кода:
False
"article"
Пример
Давайте покажем, что метод merge
обновляет уже существующий объект в сессии:
from sqlalchemy import create_engine, Integer, 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(50))
text: Mapped[str] = mapped_column(String(200))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(id=1, title='article', text='old text')
session.add(article)
session.commit()
external = Article(id=1, title='article', text='new text')
merged = session.merge(external)
session.commit()
print(merged.text)
Результат выполнения кода:
"new text"
Пример
Давайте посмотрим, какой SQL-запрос
выполняет метод merge при обновлении
существующей записи:
from sqlalchemy import create_engine, Integer, 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(50))
text: Mapped[str] = mapped_column(String(200))
engine = create_engine('sqlite:///:memory:', echo=True)
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add(Article(id=1, title='article', text='old text'))
session.commit()
external = Article(id=1, title='article', text='new text')
session.merge(external)
session.commit()
Итоговый SQL запрос:
SELECT articles.id AS articles_id, articles.title AS articles_title, articles.text AS articles_text
FROM articles
WHERE articles.id = ?
UPDATE articles SET text=? WHERE articles.id = ?