Метод 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:
Результат выполнения кода:
"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,
который обновляет состояние объекта из базы данных