Атрибут columns класса Mapper
Атрибут columns класса Mapper представляет собой коллекцию объектов Column, которые были сопоставлены с таблицей базы данных при настройке маппинга. Каждый элемент этой коллекции соответствует колонке в таблице, с которой связан mapped-класс. Атрибут доступен через объект Mapper, который можно получить из класса с помощью inspect или через атрибут __mapper__. Коллекция columns полезна при интроспекции маппинга, построении запросов и анализе структуры модели.
Синтаксис
Mapper.columns
Пример
Давайте создадим модель и получим список сопоставленных колонок через атрибут columns:
from sqlalchemy import create_engine, String, Integer
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, inspect
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))
status: Mapped[str] = mapped_column(String(50))
num: Mapped[int] = mapped_column(Integer)
mapper = inspect(Article)
for column in mapper.columns:
print(column.name, column.type)
Результат выполнения кода:
id INTEGER
title VARCHAR(100)
text VARCHAR(500)
status VARCHAR(50)
num INTEGER
Пример
Давайте получим конкретную колонку по имени и выведем ее тип и признак первичного ключа:
from sqlalchemy import String, Integer
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, inspect
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))
status: Mapped[str] = mapped_column(String(50))
num: Mapped[int] = mapped_column(Integer)
mapper = inspect(Article)
column = mapper.columns['title']
print(column.name)
print(column.type)
print(column.primary_key)
Результат выполнения кода:
"title"
VARCHAR(100)
False
Пример
Давайте переберем все колонки маппера и соберем имена тех, что входят в первичный ключ:
from sqlalchemy import String, Integer
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, inspect
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))
status: Mapped[str] = mapped_column(String(50))
num: Mapped[int] = mapped_column(Integer)
mapper = inspect(Article)
pk_columns = [col.name for col in mapper.columns if col.primary_key]
print(pk_columns)
Результат выполнения кода:
['id']
Пример
Давайте используем атрибут columns для построения запроса через select с явным перечислением колонок:
from sqlalchemy import create_engine, String, Integer, select
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, inspect, Session
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))
status: Mapped[str] = mapped_column(String(50))
num: Mapped[int] = mapped_column(Integer)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
mapper = inspect(Article)
stmt = select(mapper.columns['id'], mapper.columns['title'])
print(stmt)
Итоговый SQL запрос:
SELECT articles.id, articles.title
FROM articles
Смотрите также
-
класс
Mapper,
который представляет сопоставление класса с таблицей -
атрибут
attrs,
который хранит словарь сопоставленных атрибутов -
атрибут
primary_key,
который содержит коллекцию колонок первичного ключа -
метод
get_property,
который возвращает свойство маппера по имени