Sqlalchemy: избегать множественного наследования и иметь абстрактный базовый класс
Поэтому у меня есть несколько таблиц, использующих SQLAlchemy, которые моделируются как объекты, которые наследуются от результата до вызоваdeclarative_base()
, То есть:
Base = declarative_base()
class Table1(Base):
# __tablename__ & such here
class Table2(Base):
# __tablename__ & such here
И т.д. Я тогда хотел иметь некоторые общие функциональные возможности, доступные для каждого из моих классов таблицы БД,самый простой способ сделать это в соответствии с документами это просто сделать множественное наследование:
Base = declarative_base()
class CommonRoutines(object):
@classmethod
def somecommonaction(cls):
# body here
class Table1(CommonRoutines, Base):
# __tablename__ & such here
class Table2(CommonRoutines, Base):
# __tablename__ & such here
Что мне не нравится в этом, так это A) множественное наследование в целом немного непривлекательно (становится сложно разрешать такие вещи, какsuper()
звонки и т. д.), B) если я добавлю новую таблицу, я должен запомнить, чтобы наследовать от обоихBase
а такжеCommonRoutines
и C) действительно, что в некотором смысле класс "CommonRoutines" является типом таблицы "a-a". Действительно чтоCommonBase
is является абстрактным базовым классом, который определяет набор полей и процедур, общих для всех таблиц. Иными словами, абстрактная таблица "свое-а".
Итак, что я хотел бы это:
Base = declarative_base()
class AbstractTable(Base):
__metaclass__ = ABCMeta # make into abstract base class
# define common attributes for all tables here, like maybe:
id = Column(Integer, primary_key=True)
@classmethod
def somecommonaction(cls):
# body here
class Table1(AbstractTable):
# __tablename__ & Table1 specific fields here
class Table2(AbstractTable):
# __tablename__ & Table2 specific fields here
Но это, конечно, не работает, так как я тогда должен А) определить__tablename__
заAbstractTable
, B) аспект ABC вещей вызывает все виды головных болей, и C) должен указывать на своего рода связь БД междуAbstractTable
и каждый отдельный стол.
Поэтому мой вопрос: возможно ли достичь этого разумным способом? В идеале я хотел бы обеспечить:
Нет множественного наследованияCommonBase
/AbstractTable
быть абстрактным (то есть не может быть создан)