Метод delete класса Session
Метод delete класса Session помечает переданный объект как подлежащий удалению из базы данных. Первым параметром метод принимает экземпляр модели, который нужно удалить. Само удаление из базы данных произойдет только после вызова метода commit или flush. До этого момента объект находится в состоянии ожидания удаления.
Синтаксис
session.delete(instance)
Пример
Давайте создадим сессию, добавим статью и удалим ее методом delete:
from sqlalchemy import create_engine, String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str] = mapped_column(String(50))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(title='article')
session.add(article)
session.commit()
print(article in session)
session.delete(article)
print(article in session)
Результат выполнения кода:
True
False
Пример
Давайте убедимся, что после вызова delete и commit объект действительно удаляется из базы данных:
from sqlalchemy import create_engine, String, select
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str] = mapped_column(String(50))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(title='article')
session.add(article)
session.commit()
session.delete(article)
session.commit()
res = session.scalars(select(Article)).all()
print(res)
Результат выполнения кода:
[]
Пример
Давайте посмотрим, какой SQL-запрос генерирует SQLAlchemy при удалении объекта:
from sqlalchemy import create_engine, String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str] = mapped_column(String(50))
engine = create_engine('sqlite:///:memory:', echo=True)
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(title='article')
session.add(article)
session.commit()
session.delete(article)
session.commit()
Итоговый SQL запрос:
DELETE FROM articles WHERE articles.id = ?