Метод returning класса Delete
Метод returning класса Delete позволяет
получить значения колонок удалённых строк прямо
в момент выполнения запроса. Это полезно, когда нужно
узнать, какие именно записи были удалены, или извлечь
их данные до того, как они исчезнут из таблицы.
Метод принимает одну или несколько колонок таблицы,
значения которых должны быть возвращены. Возврат
поддерживается не всеми СУБД: например, PostgreSQL,
SQLite (начиная с версии 3.35) и MariaDB
поддерживают эту возможность, а MySQL требует
дополнительных условий.
Синтаксис
delete(table).returning(column1, column2, ...)
Пример
Давайте создадим таблицу articles и удалим из неё
одну строку, вернув её идентификатор и заголовок:
from sqlalchemy import create_engine, 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('text', String),
Column('status', String),
Column('num', Integer),
)
metadata.create_all(engine)
with engine.begin() as conn:
conn.execute(articles.insert(), [
{'id': 1, 'title': 'article 1', 'text': 'text 1', 'status': 'draft', 'num': 10},
{'id': 2, 'title': 'article 2', 'text': 'text 2', 'status': 'published', 'num': 20},
])
res = conn.execute(
articles.delete()
.where(articles.c.id == 1)
.returning(articles.c.id, articles.c.title)
)
print(res.fetchall())
Результат выполнения кода:
[(1, 'article 1')]
Пример
Давайте удалим сразу несколько строк и вернём все колонки удалённых записей:
from sqlalchemy import create_engine, 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('text', String),
Column('status', String),
Column('num', Integer),
)
metadata.create_all(engine)
with engine.begin() as conn:
conn.execute(articles.insert(), [
{'id': 1, 'title': 'article 1', 'text': 'text 1', 'status': 'draft', 'num': 10},
{'id': 2, 'title': 'article 2', 'text': 'text 2', 'status': 'published', 'num': 20},
{'id': 3, 'title': 'article 3', 'text': 'text 3', 'status': 'draft', 'num': 30},
])
res = conn.execute(
articles.delete()
.where(articles.c.status == 'draft')
.returning(articles)
)
for row in res:
print(row)
Результат выполнения кода:
(1, 'article 1', 'text 1', 'draft', 10)
(3, 'article 3', 'text 3', 'draft', 30)
Смотрите также
-
класс
Delete,
который представляет DELETE-запрос -
метод
where,
который задаёт условие удаления строк -
метод
returning,
который возвращает значения колонок удалённых строк -
метод
execution_options,
который задаёт параметры выполнения запроса