Метод returning класса Update
Метод returning класса Update указывает,
какие столбцы должны быть возвращены базой данных
после выполнения запроса на обновление. Это удобно,
когда нужно получить новые значения изменённых строк
без выполнения дополнительного SELECT-запроса.
Первым параметром метод принимает столбцы или
SQL-выражения для возврата.
Синтаксис
update(table).returning(column, [column, ...])
Пример
Давайте создадим таблицу статей и обновим статус одной из них, вернув новые значения столбцов:
from sqlalchemy import create_engine, update, MetaData, Table, Column, Integer, String
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')
.returning(articles.c.id, articles.c.title, articles.c.status)
)
res = conn.execute(stmt)
print(res.fetchall())
Результат выполнения кода:
[(1, 'article 1', 'published')]
Пример
Давайте обновим несколько строк и вернём только
столбец status, чтобы увидеть новые значения:
from sqlalchemy import create_engine, update, MetaData, Table, Column, Integer, String
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.status == 'draft')
.values(status='published')
.returning(articles.c.id, articles.c.status)
)
res = conn.execute(stmt)
print(res.fetchall())
Результат выполнения кода:
[(1, 'published'), (2, 'published'), (3, 'published')]
Пример
Давайте вернём все столбцы обновлённой строки,
передав таблицу целиком в метод returning:
from sqlalchemy import create_engine, update, MetaData, Table, Column, Integer, String
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'},
])
stmt = (
update(articles)
.where(articles.c.id == 1)
.values(status='published')
.returning(articles)
)
res = conn.execute(stmt)
print(res.fetchall())
Результат выполнения кода:
[(1, 'article 1', 'published')]
Смотрите также
-
класс
Update,
который представляет запрос на обновление данных -
метод
values,
который задаёт новые значения столбцов -
метод
where,
который задаёт условие отбора строк -
метод
execution_options,
который настраивает параметры выполнения запроса