Класс Delete
Класс Delete представляет конструкцию
удаления строк из таблицы базы данных. Объект
этого класса создается автоматически при вызове
метода delete у таблицы или ORM-класса.
Класс поддерживает методы where для
фильтрации удаляемых строк, returning
для возврата значений удаленных строк и
execution_options для настройки
выполнения запроса.
Синтаксис
from sqlalchemy import delete
stmt = delete(table)
stmt = delete(table).where(condition)
Пример
Давайте создадим таблицу и удалим из нее
одну строку с помощью класса Delete:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, delete
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(), [
{'title': 'article 1', 'text': 'text 1', 'status': 'new', 'num': 1},
{'title': 'article 2', 'text': 'text 2', 'status': 'old', 'num': 2},
{'title': 'article 3', 'text': 'text 3', 'status': 'new', 'num': 3}
])
stmt = delete(articles).where(articles.c.status == 'old')
res = conn.execute(stmt)
print(res.rowcount)
rows = conn.execute(articles.select()).fetchall()
print(rows)
Результат выполнения кода:
1
[(1, 'article 1', 'text 1', 'new', 1), (3, 'article 3', 'text 3', 'new', 3)]
Пример
Давайте удалим сразу все строки из таблицы,
не указывая условие where:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, delete
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(), [
{'title': 'article 1', 'text': 'text 1', 'status': 'new', 'num': 1},
{'title': 'article 2', 'text': 'text 2', 'status': 'old', 'num': 2}
])
stmt = delete(articles)
res = conn.execute(stmt)
print(res.rowcount)
rows = conn.execute(articles.select()).fetchall()
print(rows)
Результат выполнения кода:
2
[]
Пример
Давайте используем метод returning,
чтобы получить значения удаленных строк:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, delete
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(), [
{'title': 'article 1', 'text': 'text 1', 'status': 'new', 'num': 1},
{'title': 'article 2', 'text': 'text 2', 'status': 'old', 'num': 2},
{'title': 'article 3', 'text': 'text 3', 'status': 'new', 'num': 3}
])
stmt = delete(articles).where(articles.c.num > 1).returning(articles.c.title)
res = conn.execute(stmt)
print(res.fetchall())
Результат выполнения кода:
[('article 2',), ('article 3',)]
Итоговый SQL запрос
Запрос, который генерирует класс Delete
с условием where, выглядит так:
DELETE FROM articles WHERE articles.status = 'old'
Смотрите также
-
класс
Delete,
который представляет конструкцию удаления строк -
метод
where,
который задает условие фильтрации удаляемых строк -
метод
returning,
который возвращает значения удаленных строк -
метод
execution_options,
который настраивает параметры выполнения запроса