Метод 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,
который хранит отслеживаемые объекты