Атрибут __table__
Атрибут __table__ доступен у любого
декларативного класса и возвращает объект
Table,
который SQLAlchemy автоматически создает
на основе атрибута __tablename__ и
описанных колонок. Через этот атрибут можно
получить доступ к метаданным таблицы: ее имени,
колонкам, ограничениям, схеме. Атрибут доступен
как на самом классе, так и на его экземплярах.
Синтаксис
Model.__table__
Пример
Давайте создадим модель и получим имя
ее таблицы через атрибут __table__:
from sqlalchemy import String, Integer
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(255))
print(Article.__table__)
print(Article.__table__.name)
Результат выполнения кода:
"Table('articles', MetaData(), Column('id', Integer(), table=<articles>, primary_key=True, nullable=False), Column('title', String(length=100), table=<articles>, nullable=False), Column('text', String(length=255), table=<articles>, nullable=False), schema=None)"
"articles"
Пример
Давайте переберем колонки таблицы
через атрибут __table__:
from sqlalchemy import 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))
for column in Article.__table__.columns:
print(column.name, column.type)
Результат выполнения кода:
"id Integer()"
"title String(length=100)"
"status String(length=50)"
Пример
Давайте получим объект колонки по имени
через атрибут __table__ и выведем
ее тип:
from sqlalchemy import 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)
num: Mapped[int]
title: Mapped[str] = mapped_column(String(100))
column = Article.__table__.c.num
print(column)
print(column.type)
Результат выполнения кода:
"articles.num"
"Integer()"
Пример
Давайте создадим таблицу в базе данных
через метод create_all, используя
метаданные из атрибута __table__:
from sqlalchemy import String, create_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))
text: Mapped[str] = mapped_column(String(255))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
print(Article.__table__.metadata is Base.metadata)
Результат выполнения кода:
"True"
Смотрите также
-
атрибут
__tablename__,
который задает имя таблицы модели -
атрибут
__table_args__,
который задает дополнительные аргументы таблицы -
класс
DeclarativeBase,
который является базой декларативных моделей -
функцию
mapped_column,
которая описывает колонку модели