Атрибут attrs
Атрибут attrs класса Mapper возвращает объект
ImmutableProperties, который представляет собой коллекцию всех
атрибутов, сконфигурированных для данного маппера. В эту коллекцию
входят как колоночные атрибуты, соответствующие столбцам таблицы,
так и атрибуты связей между моделями. Коллекция доступна только
для чтения и позволяет перебирать атрибуты, обращаться к ним по
имени и получать информацию о каждом из них.
Синтаксис
Mapper.attrs
Пример
Давайте создадим модель и получим список всех ее атрибутов через маппер:
from sqlalchemy import create_engine, String
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))
text: Mapped[str] = mapped_column(String(500))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
mapper = Article.__mapper__
for attr in mapper.attrs:
print(attr.key)
Результат выполнения кода:
"id"
"title"
"text"
Пример
Давайте обратимся к конкретному атрибуту по имени и выведем информацию о нем:
from sqlalchemy import create_engine, String
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))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
mapper = Article.__mapper__
attr = mapper.attrs['title']
print(attr)
print(attr.key)
print(attr.columns)
Результат выполнения кода:
"ColumnProperty(Article.title)"
"title"
"(Column('title', String(length=100), table=<articles>),)"
Пример
Давайте проверим наличие атрибута в коллекции и получим их количество:
from sqlalchemy import create_engine, String
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))
status: Mapped[str] = mapped_column(String(50))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
mapper = Article.__mapper__
print('title' in mapper.attrs)
print('missing' in mapper.attrs)
print(len(mapper.attrs))
Результат выполнения кода:
True
False
3
Пример
Давайте переберем атрибуты и для каждого выведем имя соответствующего столбца:
from sqlalchemy import create_engine, String
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))
num: Mapped[int] = mapped_column()
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
mapper = Article.__mapper__
for attr in mapper.attrs:
for column in attr.columns:
print(attr.key, '->', column.name)
Результат выполнения кода:
"id -> id"
"title -> title"
"num -> num"
Смотрите также
-
класс
Mapper,
который представляет маппер модели -
атрибут
columns,
который возвращает столбцы маппера -
атрибут
relationships,
который возвращает связи маппера -
метод
get_property,
который возвращает атрибут по имени