Функция delete создает объект
Delete, который представляет
SQL-выражение DELETE. Первым параметром
функция принимает таблицу или ORM-сущность,
из которой нужно удалить записи. Дополнительно
можно передать условие where для
выбора удаляемых строк. Если условие не указано,
будут удалены все записи таблицы.
Функция возвращает объект, который можно
выполнить через соединение или сессию.
При выполнении возвращается результат с
количеством удаленных строк в атрибуте
rowcount.
Синтаксис
delete(table)
delete(table).where(condition)
Пример
Давайте создадим таблицу articles
и удалим из нее все записи:
<+python+>
from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, 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': 'draft', 'num': 1},
{'title': 'article 2', 'text': 'text 2', 'status': 'published', 'num': 2},
])
with engine.begin() as conn:
res = conn.execute(delete(articles))
print(res.rowcount)
<-python+>
Результат выполнения кода:
<+python+>
2
<-python+>
Пример
Давайте удалим только те записи, у которых
статус равен draft, с помощью
метода where:
<+python+>
from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, 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': 'draft', 'num': 1},
{'title': 'article 2', 'text': 'text 2', 'status': 'published', 'num': 2},
{'title': 'article 3', 'text': 'text 3', 'status': 'draft', 'num': 3},
])
with engine.begin() as conn:
stmt = delete(articles).where(articles.c.status == 'draft')
res = conn.execute(stmt)
print(res.rowcount)
<-python+>
Результат выполнения кода:
<+python+>
2
<-python+>
Итоговый SQL запрос:
<+sql+>
DELETE FROM articles WHERE articles.status = 'draft'
<-sql+>
Пример
Давайте удалим запись по конкретному
идентификатору:
<+python+>
from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, 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(), [
{'id': 1, 'title': 'article 1', 'text': 'text 1', 'status': 'draft', 'num': 1},
{'id': 2, 'title': 'article 2', 'text': 'text 2', 'status': 'published', 'num': 2},
])
with engine.begin() as conn:
stmt = delete(articles).where(articles.c.id == 1)
res = conn.execute(stmt)
print(res.rowcount)
<-python+>
Результат выполнения кода:
<+python+>
1
<-python+>
Итоговый SQL запрос:
<+sql+>
DELETE FROM articles WHERE articles.id = 1
<-sql+>
Пример
Давайте удалим записи с помощью ORM-сессии,
передав в функцию delete ORM-класс:
<+python+>
from sqlalchemy import create_engine, Integer, String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
from sqlalchemy import delete
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
text: Mapped[str]
status: Mapped[str]
num: Mapped[int]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add_all([
Article(title='article 1', text='text 1', status='draft', num=1),
Article(title='article 2', text='text 2', status='published', num=2),
Article(title='article 3', text='text 3', status='draft', num=3),
])
session.commit()
with Session(engine) as session:
stmt = delete(Article).where(Article.status == 'published')
res = session.execute(stmt)
session.commit()
print(res.rowcount)
<-python+>
Результат выполнения кода:
<+python+>
1
<-python+>
Итоговый SQL запрос:
<+sql+>
DELETE FROM articles WHERE articles.status = 'published'
<-sql+>
Смотрите также
-
функцию
select,
которая создает запрос на выборку данных
-
функцию
insert,
которая создает запрос на вставку записей
-
функцию
update,
которая создает запрос на обновление записей
-
функцию
exists,
которая создает запрос на проверку существования записей