Метод delete
Метод delete класса AsyncSession помечает
переданный объект как подлежащий удалению из базы данных
при следующей синхронизации с БД. Первым параметром метод
принимает экземпляр модели ORM, который необходимо удалить.
Удаление вступит в силу только после вызова метода flush
или commit.
Синтаксис
await session.delete(instance)
Пример
Давайте создадим модель Article и удалим одну запись
из таблицы с помощью метода delete:
import asyncio
from sqlalchemy import String, select
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str] = mapped_column(String(100))
text: Mapped[str] = mapped_column(String(1000))
async def main():
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
async with AsyncSession(engine) as session:
article = Article(title='article', text='some text')
session.add(article)
await session.commit()
await session.delete(article)
await session.commit()
res = await session.scalars(select(Article))
print(res.all())
asyncio.run(main())
Результат выполнения кода:
[]
Пример
Давайте получим объект из базы через метод get
и затем удалим его:
import asyncio
from sqlalchemy import String, select
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str] = mapped_column(String(100))
text: Mapped[str] = mapped_column(String(1000))
async def main():
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
async with AsyncSession(engine) as session:
session.add_all([
Article(title='article 1', text='text 1'),
Article(title='article 2', text='text 2'),
])
await session.commit()
article = await session.get(Article, 1)
await session.delete(article)
await session.commit()
res = await session.scalars(select(Article.title))
print(res.all())
asyncio.run(main())
Результат выполнения кода:
['article 2']
Пример
Давайте посмотрим, какой SQL-запрос выполняет
метод delete при синхронизации с базой:
import asyncio
from sqlalchemy import String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str] = mapped_column(String(100))
async def main():
engine = create_async_engine('sqlite+aiosqlite:///:memory:', echo=True)
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
async with AsyncSession(engine) as session:
article = Article(title='article')
session.add(article)
await session.commit()
await session.delete(article)
await session.commit()
asyncio.run(main())
Итоговый SQL запрос:
DELETE FROM articles WHERE articles.id = ?
Смотрите также
-
класс
AsyncSession,
который представляет асинхронную сессию -
метод
flush,
который синхронизирует изменения с базой -
метод
commit,
который фиксирует транзакцию -
метод
rollback,
который откатывает транзакцию