sqlalchemy: Как Base узнает, что я определил класс, сопоставленный с ним? - PullRequest
2 голосов
/ 24 января 2012

Это просто работает, когда я просто делаю наследование с моим классом

class User(Base):
    __tablename__ = ’users’
    id = Column(Integer, primary_key=True)
    name = Column(String)
    fullname = Column(String)
    password = Column(String)

И тогда я могу создать таблицу, используя Base.metadata.create_all(engine)

Мой вопрос, как можноsqlalchemy знаете, что я уже определил пользователя (унаследовано от базы)?

Ответы [ 2 ]

5 голосов
/ 25 января 2012

Каждый декларативный базовый класс ведет реестр потомков классов, который заполняется при выполнении определения класса (в __init__() метод метакласса). Но этот реестр на самом деле не используется create_all(). Экземпляр MetaData (Base.metadata) является частью ядра SQLAlchemy (не ORM) и отвечает за ведение реестра таблиц. Экземпляр MetaData запоминает таблицу, когда она создается (и сохраняется в атрибуте __table__ класса) из того же метода __init__() декларативного метакласса. Вы можете получить этот список таблиц через свойство Base.metadata.sorted_tables.

3 голосов
/ 25 января 2012

Когда вы унаследуете от любого класса, он даст вам цепочку для отслеживания по всем его подклассам.С помощью трюка, приведенного в Как перебрать все объявления классов, происходящих от определенного базового класса? , вы получите все подклассы.

Надеюсь, это поможет вам решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...