Метод refresh класса AsyncSession
Метод refresh класса AsyncSession повторно загружает данные объекта из базы данных, обновляя его атрибуты актуальными значениями. Первым параметром метод принимает экземпляр модели, который нужно обновить. Вторым необязательным параметром можно передать список атрибутов attribute_names, которые следует обновить. Также доступен параметр with_for_update для блокировки строки при чтении.
Синтаксис
await session.refresh(instance, [attribute_names], [with_for_update])
Пример
Давайте создадим асинхронную сессию, добавим объект и обновим его через метод refresh:
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:')
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()
print(article.title)
await session.refresh(article)
print(article.title)
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
"article"
"article"
Пример
Давайте обновим только определённый атрибут объекта, передав его имя в параметре attribute_names:
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))
text: Mapped[str] = mapped_column(String(100))
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')
session.add(article)
await session.commit()
await session.refresh(article, ['title'])
print(article.title)
print(article.text)
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
"article"
"text"
Пример
Давайте обновим объект, который был изменён в базе данных другим запросом:
import asyncio
from sqlalchemy import String, update
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:')
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()
print(article.title)
await session.execute(
update(Article).where(Article.id == article.id).values(title='user')
)
await session.commit()
await session.refresh(article)
print(article.title)
await engine.dispose()
asyncio.run(main())
Результат выполнения кода:
"article"
"user"
Смотрите также
-
класс
AsyncSession,
который представляет асинхронную сессию -
метод
flush,
который синхронизирует состояние объектов с базой -
метод
expire,
который помечает атрибуты объекта устаревшими -
метод
commit,
который фиксирует текущую транзакцию