Как ORM Ormar обнаруживает и регистрирует все определенные модели

Ответ

Ormar использует метаклассы для автоматического обнаружения и регистрации всех моделей, которые наследуются от базового класса ormar.Model.

Процесс выглядит следующим образом:

  1. Наследование: Когда вы определяете свою модель, например class Book(ormar.Model):, она наследует функциональность ormar.Model.
  2. Работа метакласса: В ormar.Model встроен метакласс, который «перехватывает» момент создания нового класса (например, Book).
  3. Регистрация: В этот момент метакласс анализирует класс, его поля (аннотации типов) и вложенный класс 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]