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

Метод get класса AsyncSession

Метод get класса AsyncSession возвращает экземпляр модели по значению первичного ключа. Первым параметром метод принимает класс модели, вторым - значение первичного ключа. Если объект не найден, метод возвращает None. Метод является асинхронным, поэтому вызывается через await. При наличии объекта в карте идентичности метод возвращает его без обращения к базе данных.

Синтаксис

await session.get(entity, ident, [options])

Пример

Давайте создадим модель и получим объект по первичному ключу:

import asyncio from sqlalchemy import String from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine 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] = 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: session.add(Article(id=1, title='article')) await session.commit() res = await session.get(Article, 1) print(res) print(res.title) await engine.dispose() asyncio.run(main())

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

"<Article(id=1, title='article')>" "article"

Пример

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

<+python+> import asyncio from sqlalchemy import String from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine 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] = 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: res = await session.get(Article, 999) print(res) await engine.dispose() asyncio.run(main()) <-python+>

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

"None"

Пример

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

import asyncio from sqlalchemy import String from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine 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) num: 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: session.add(Article(id=1, num=5, title='article')) await session.commit() res = await session.get(Article, (1, 5)) print(res) print(res.title) await engine.dispose() asyncio.run(main())

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

"<Article(id=1, num=5, title='article')>" "article"

Пример

Давайте передадим параметр options, чтобы подгрузить связанные данные через selectinload:

import asyncio from sqlalchemy import ForeignKey, String from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship, selectinload class Base(DeclarativeBase): pass class Article(Base): __tablename__ = 'articles' id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] = mapped_column(String(100)) class Comment(Base): __tablename__ = 'comments' id: Mapped[int] = mapped_column(primary_key=True) article_id: Mapped[int] = mapped_column(ForeignKey('articles.id')) text: Mapped[str] = mapped_column(String(100)) Article.comments = relationship('Comment', lazy='raise') 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(Article(id=1, title='article')) session.add(Comment(id=1, article_id=1, text='text')) await session.commit() res = await session.get(Article, 1, options=[selectinload(Article.comments)]) print(res.comments) await engine.dispose() asyncio.run(main())

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

"[<Comment(id=1, article_id=1, text='text')>]"

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

  • класс AsyncSession,
    который представляет асинхронную сессию
  • метод get_one,
    который извлекает объект по первичному ключу и вызывает ошибку при отсутствии
  • метод execute,
    который выполняет произвольный SQL-запрос
  • метод refresh,
    который обновляет состояние объекта из базы данных
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить