Метод expunge класса AsyncSession
Метод expunge класса AsyncSession удаляет
указанный объект из сессии. После вызова метода объект
становится transient-объектом: он больше не отслеживается
сессией, не участвует в flush и не сохраняется при commit.
Первым параметром метод принимает экземпляр модели,
который нужно исключить из сессии. Если объект не
присутствует в сессии, метод не вызывает ошибку.
Синтаксис
await session.expunge(instance)
Пример
Давайте создадим объект, добавим его в сессию, а затем
удалим из нее методом expunge:
import asyncio
from sqlalchemy import Integer, 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(Integer, primary_key=True)
title: Mapped[str] = mapped_column(String)
text: Mapped[str] = mapped_column(String)
status: Mapped[str] = mapped_column(String)
num: Mapped[int] = mapped_column(Integer)
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='text',
status='draft',
num=1,
)
session.add(article)
print(article in session)
session.expunge(article)
print(article in session)
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
True
False
Пример
Давайте убедимся, что после expunge объект не
попадает в базу данных при commit:
import asyncio
from sqlalchemy import Integer, 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(Integer, primary_key=True)
title: Mapped[str] = mapped_column(String)
text: Mapped[str] = mapped_column(String)
status: Mapped[str] = mapped_column(String)
num: Mapped[int] = mapped_column(Integer)
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='text',
status='draft',
num=1,
)
session.add(article)
session.expunge(article)
await session.commit()
res = await session.scalars(select(Article))
print(res.all())
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
[]
Пример
Давайте сравним поведение expunge и expunge_all
при работе с несколькими объектами:
import asyncio
from sqlalchemy import Integer, 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(Integer, primary_key=True)
title: Mapped[str] = mapped_column(String)
text: Mapped[str] = mapped_column(String)
status: Mapped[str] = mapped_column(String)
num: Mapped[int] = mapped_column(Integer)
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:
article1 = Article(
title='article',
text='text',
status='draft',
num=1,
)
article2 = Article(
title='article',
text='text',
status='draft',
num=2,
)
session.add_all([article1, article2])
session.expunge(article1)
print(article1 in session, article2 in session)
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
False True
Смотрите также
-
класс
AsyncSession,
который представляет асинхронную сессию -
метод
expunge_all,
который удаляет из сессии все объекты -
метод
add,
который добавляет объект в сессию -
метод
expire,
который сбрасывает состояние атрибутов объекта