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

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

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

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