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

Атрибут onupdate

Атрибут onupdate класса Column задает значение, которое автоматически подставляется в столбец при каждом обновлении строки. Атрибут принимает SQL-выражение, функцию Python или вызываемый объект. В отличие от default, который срабатывает при вставке, onupdate срабатывает при каждом UPDATE-запросе, если значение столбца не задано явно.

Синтаксис

Column(..., onupdate=value)

Пример

Давайте создадим таблицу со столбцом, который автоматически обновляется при изменении строки:

from sqlalchemy import create_engine, Column, Integer, String, DateTime, func from sqlalchemy.orm import DeclarativeBase, Session class Base(DeclarativeBase): pass class Article(Base): __tablename__ = 'articles' id = Column(Integer, primary_key=True) title = Column(String) updated_at = Column(DateTime, onupdate=func.now()) engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: article = Article(title='article') session.add(article) session.commit() article.title = 'article updated' session.commit() print(article.updated_at)

Результат выполнения кода:

"2024-01-01 12:00:00"

Пример

Давайте используем Python-функцию для вычисления нового значения при обновлении:

from sqlalchemy import create_engine, Column, Integer, String from sqlalchemy.orm import DeclarativeBase, Session class Base(DeclarativeBase): pass def increment_version(context): return context.get_current_parameters()['num'] + 1 class Article(Base): __tablename__ = 'articles' id = Column(Integer, primary_key=True) title = Column(String) num = Column(Integer, default=0, onupdate=increment_version) engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) with Session(engine) as session: article = Article(title='article') session.add(article) session.commit() print(article.num) article.title = 'article updated' session.commit() print(article.num)

Результат выполнения кода:

0 1

Пример

Давайте посмотрим, какой SQL-запрос генерирует SQLAlchemy при использовании onupdate:

from sqlalchemy import create_engine, Column, Integer, String, DateTime, func from sqlalchemy.orm import DeclarativeBase, Session class Base(DeclarativeBase): pass class Article(Base): __tablename__ = 'articles' id = Column(Integer, primary_key=True) title = Column(String) updated_at = Column(DateTime, onupdate=func.now()) engine = create_engine('sqlite:///:memory:', echo=True) Base.metadata.create_all(engine) with Session(engine) as session: article = Article(title='article') session.add(article) session.commit() article.title = 'article updated' session.commit()

Итоговый SQL запрос:

UPDATE articles SET title=?, updated_at=CURRENT_TIMESTAMP WHERE articles.id = ?

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

  • класс Column,
    который представляет столбец таблицы
  • атрибут default,
    который задает значение по умолчанию при вставке
  • атрибут server_default,
    который задает серверное значение по умолчанию
  • атрибут type,
    который определяет тип данных столбца
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить