Ответ
Ormar использует метаклассы для автоматического обнаружения и регистрации всех моделей, которые наследуются от базового класса ormar.Model
.
Процесс выглядит следующим образом:
- Наследование: Когда вы определяете свою модель, например
class Book(ormar.Model):
, она наследует функциональностьormar.Model
. - Работа метакласса: В
ormar.Model
встроен метакласс, который «перехватывает» момент создания нового класса (например,Book
). - Регистрация: В этот момент метакласс анализирует класс, его поля (аннотации типов) и вложенный класс
Meta
, после чего добавляет информацию о новой модели в специальный глобальный реестр —ormar.Model.MetaRegistry
.
Пример
import databases
import sqlalchemy
import ormar
metadata = sqlalchemy.MetaData()
database = databases.Database("sqlite:///db.sqlite")
class BaseMeta(ormar.ModelMeta):
metadata = metadata
database = database
# При определении этих классов, они автоматически регистрируются
class Author(ormar.Model):
class Meta(BaseMeta):
tablename = "authors"
id: int = ormar.Integer(primary_key=True)
name: str = ormar.String(max_length=100)
class Book(ormar.Model):
class Meta(BaseMeta):
tablename = "books"
id: int = ormar.Integer(primary_key=True)
title: str = ormar.String(max_length=100)
author: Author = ormar.ForeignKey(Author)
Практическое применение
Этот механизм автоматической регистрации необходим для:
- Генерации SQL:
metadata.create_all(engine)
использует собранные вmetadata
данные для создания таблиц. - Миграций: Инструменты вроде Alembic могут использовать
metadata
для автоматического создания миграций. - Построения схемы API: В FastAPI Ormar использует этот реестр для генерации Pydantic-схем.
Получить список всех зарегистрированных моделей можно программно:
all_models = ormar.Model.MetaRegistry.get_models()
# -> вернет список классов [Author, Book]