Метод refresh
Метод refresh класса Session обновляет состояние
объекта из базы данных. Первым параметром метод принимает
экземпляр модели. Вторым необязательным параметром передается
список атрибутов, которые нужно обновить. Третьим необязательным
параметром передается словарь with_for_update для блокировки
строки. Метод выполняет SELECT-запрос к базе и заново заполняет
атрибуты объекта.
Синтаксис
session.refresh(instance, [attribute_names], [with_for_update])
Пример
Давайте создадим модель и объект, а затем обновим его
через метод refresh:
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(50))
text: Mapped[str] = mapped_column(String(50))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(id=1, title='article', text='text')
session.add(article)
session.commit()
article.title = 'changed'
session.refresh(article)
print(article.title)
Результат выполнения кода:
"article"
Пример
Давайте обновим только один атрибут объекта, передав его имя вторым параметром:
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(50))
text: Mapped[str] = mapped_column(String(50))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(id=1, title='article', text='text')
session.add(article)
session.commit()
article.title = 'changed title'
article.text = 'changed text'
session.refresh(article, ['title'])
print(article.title)
print(article.text)
Результат выполнения кода:
"article"
"changed text"
Как видно из результата, атрибут title был обновлен
из базы данных, а атрибут text сохранил измененное
в Python значение.
Пример
Давайте посмотрим, какой SQL-запрос выполняет метод refresh
при включенном echo:
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(50))
engine = create_engine('sqlite:///:memory:', echo=True)
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(id=1, title='article')
session.add(article)
session.commit()
session.refresh(article)
Итоговый SQL запрос:
SELECT articles.id AS articles_id, articles.title AS articles_title
FROM articles
WHERE articles.id = ?