Метод 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,
который задает параметры выполнения запроса