Итак, у меня есть несколько таблиц, использующих SQLAlchemy, которые моделируются как объекты, которые наследуются от результата до вызова declarative_base()
. То есть:
Base = declarative_base()
class Table1(Base):
# __tablename__ & such here
class Table2(Base):
# __tablename__ & such here
Etc. Затем я хотел иметь некоторые общие функциональные возможности, доступные для каждого из моих классов таблиц БД, самый простой способ сделать это в соответствии с документами - это просто сделать множественное наследование:
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" в некотором смысле является таблицей типа. На самом деле CommonBase
является абстрактным базовым классом, который определяет набор полей и процедур, общих для всех таблиц. Иными словами, абстрактная таблица "свое-а".
Итак, что бы я хотел, это:
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
Но это, конечно, не работает, так как я тогда должен A) определить __tablename__
для AbstractTable
, B) аспект ABC вещей вызывает все виды головных болей, и C) должен указывать на некоторый вид связи БД между AbstractTable
и каждой отдельной таблицей.
Итак, мой вопрос: возможно ли достичь этого разумным способом? В идеале я хотел бы применить:
- Нет множественного наследования
CommonBase
/ AbstractTable
быть абстрактным (т.е. не может быть создан)