РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
591 of 711 menu

Метод expunge_all

Метод expunge_all класса AsyncSession удаляет все объекты из сессии, переводя их в состояние detached. После вызова метода сессия перестает отслеживать изменения этих объектов, а сами объекты сохраняют свои значения, но теряют связь с сессией. Метод не принимает параметров.

Синтаксис

await session.expunge_all()

Пример

Давайте создадим сессию, добавим объект и проверим, что он находится в сессии:

from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column 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]

Теперь добавим статью в сессию и проверим ее наличие через in:

<+python+> from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine from sqlalchemy.orm import sessionmaker from models import Article engine = create_async_engine('sqlite+aiosqlite:///:memory:') async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False) async def main(): async with async_session() as session: article = Article(title='article', text='text', status='draft', num=1) session.add(article) print(article in session) await session.expunge_all() print(article in session) import asyncio asyncio.run(main()) <-python+>

Результат выполнения кода:

True False

Пример

Давайте убедимся, что после вызова expunge_all объект сохраняет свои значения, но перестает быть связанным с сессией:

<+python+> from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine from sqlalchemy.orm import sessionmaker from models import Article engine = create_async_engine('sqlite+aiosqlite:///:memory:') async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False) async def main(): async with async_session() as session: article = Article(title='article', text='text', status='draft', num=1) session.add(article) print(session.identity_map.keys()) await session.expunge_all() print(session.identity_map.keys()) print(article.title) import asyncio asyncio.run(main()) <-python+>

Результат выполнения кода:

[1] [] "article"

Пример

Давайте покажем, что после вызова expunge_all изменения объекта не отслеживаются сессией и не сбрасываются в базу данных при коммите:

<+python+> from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine from sqlalchemy.orm import sessionmaker from models import Article, Base engine = create_async_engine('sqlite+aiosqlite:///:memory:') async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False) async def main(): async with engine.begin() as conn: await conn.run_sync(Base.metadata.create_all) async with async_session() as session: article = Article(title='article', text='text', status='draft', num=1) session.add(article) await session.commit() article.title = 'updated' await session.expunge_all() await session.commit() print(article.title) import asyncio asyncio.run(main()) <-python+>

Результат выполнения кода:

"updated"

Смотрите также

  • класс AsyncSession,
    который представляет асинхронную сессию
  • метод expunge,
    который удаляет один объект из сессии
  • метод expire_all,
    который устаревает все объекты сессии
  • атрибут identity_map,
    который хранит отслеживаемые объекты
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить