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

Метод where класса Update

Метод where класса Update добавляет условие к запросу обновления. Он принимает одно или несколько логических выражений, которые определяют, какие строки таблицы должны быть обновлены. Условие можно задавать при помощи обычных операторов сравнения или функций, таких как and_, or_ и in_.

Метод возвращает новый объект Update, что позволяет выстраивать цепочку вызовов. Если метод where не вызван, то запрос UPDATE затронет все строки таблицы.

Синтаксис

update(table).where(*conditions)

Пример

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

from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, update engine = create_engine('sqlite:///:memory:') metadata = MetaData() articles = Table( 'articles', metadata, Column('id', Integer, primary_key=True), Column('title', String), Column('status', String), ) metadata.create_all(engine) with engine.begin() as conn: conn.execute(articles.insert(), [ {'id': 1, 'title': 'article 1', 'status': 'draft'}, {'id': 2, 'title': 'article 2', 'status': 'draft'}, ]) stmt = update(articles).where(articles.c.id == 1).values(status='published') res = conn.execute(stmt) print(res.rowcount)

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

1

Пример

Давайте объединим два условия через and_, чтобы обновить только нужные строки:

from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, update, and_ engine = create_engine('sqlite:///:memory:') metadata = MetaData() articles = Table( 'articles', metadata, Column('id', Integer, primary_key=True), Column('title', String), Column('status', String), ) metadata.create_all(engine) with engine.begin() as conn: conn.execute(articles.insert(), [ {'id': 1, 'title': 'article 1', 'status': 'draft'}, {'id': 2, 'title': 'article 2', 'status': 'draft'}, {'id': 3, 'title': 'article 3', 'status': 'published'}, ]) stmt = ( update(articles) .where(and_(articles.c.status == 'draft', articles.c.id > 1)) .values(status='published') ) res = conn.execute(stmt) print(res.rowcount)

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

1

Пример

Давайте используем оператор in_ для обновления нескольких строк сразу:

from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, update engine = create_engine('sqlite:///:memory:') metadata = MetaData() articles = Table( 'articles', metadata, Column('id', Integer, primary_key=True), Column('title', String), Column('status', String), ) metadata.create_all(engine) with engine.begin() as conn: conn.execute(articles.insert(), [ {'id': 1, 'title': 'article 1', 'status': 'draft'}, {'id': 2, 'title': 'article 2', 'status': 'draft'}, {'id': 3, 'title': 'article 3', 'status': 'draft'}, ]) stmt = ( update(articles) .where(articles.c.id.in_([1, 3])) .values(status='published') ) res = conn.execute(stmt) print(res.rowcount)

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

2

Пример

Давайте посмотрим, какой SQL-запрос формируется при использовании метода where:

from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, update engine = create_engine('sqlite:///:memory:') metadata = MetaData() articles = Table( 'articles', metadata, Column('id', Integer, primary_key=True), Column('title', String), Column('status', String), ) stmt = ( update(articles) .where(articles.c.status == 'draft') .values(status='published') ) print(stmt)

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

UPDATE articles SET status=:status WHERE articles.status = :status_1

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

  • класс Update,
    который представляет запрос UPDATE
  • метод values,
    который задает обновляемые значения
  • метод returning,
    который возвращает обновленные строки
  • метод execution_options,
    который задает параметры выполнения запроса
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить