Как создать декларативное базовое поведение, подобное SQLAlchemy, с использованием метакласса?

#python #sqlalchemy #orm #metaclass

Вопрос:

Я пытаюсь эмулировать декларативное базовое поведение SQLAlchemy. Что я хотел бы сделать, так это определить набор моделей, которые наследуются от базового класса, а затем выполнить что-то вроде Base.meta.create_all инициализации некоторых таблиц, индекса и т. Д.

Я сделал так, чтобы мой пользовательский Base класс с metadata аргументом использовал BaseMeta класс, который создает некоторые сопоставления, следуя этому примеру.

Дело в том, что SQLAlchemy имеет этот класс метаданных внутри базового класса, который содержит такие методы, как create_all и drop_all и каким-то образом считывает все модели, унаследованные от Base . Я немного поиграл Base.__subclasses__() , и это вроде как работает, но это не имеет ничего общего с этим MetaData классом, на который есть все Table ссылки.

Пожалуйста, обратите внимание, что я не спрашиваю, как использовать SQLAlchemy, я пытаюсь создать пользовательский клон, подобный SQLAlchemy, просто чтобы научиться.