2015-08-05 4 views
1

Теперь этот ответ немного искал, но я не могу найти его, поскольку все относится к объединенному наследованию таблицы, которое я понимаю, но не хочу использовать. Я хочу создать несколько классов в SQLAlchemy, которые идентичны в построении таблиц, только отличающиеся именем имени класса и таблицы базы данных. Я намеренно разделяю таблицы и не использую дискриминатор, потому что ожидаю, что эти таблицы вырастут до очень больших размеров. Существует также вероятность того, что схемы таблиц могут медленно расходиться с течением времени, причем некоторые поля добавляются к одному, но не к другому.SQLAlchemy - несколько классов, идентичные таблицы

Я знаю, что следующий код не работает, поскольку SQLAlchemy пытается найти внешний ключ для присоединенного наследования таблиц вместо того, чтобы делать их независимыми таблицами, но это в основном то, что я собираюсь сделать. Я был над документами, но не могу понять, как правильно это реализовать. Есть ли способ (или несколько способов) сделать это?

from sqlalchemy.ext.declarative import declarative_base 

Base = declarative_base() 

class HDD(Base): 
    """Class representing a hard drive.""" 

    __tablename__ = 'HDDs' 

    _id = Column(
     Integer, 
     doc="Auto-incrementing primary key", 
     name="id", 
     primary_key=True) 
    manufacturer = Column(
     String(40), 
     doc="Hard drive manufacturer.") 
    ... 

class SDD(HDD): 
    __tablename__ = 'SSDs' 
    ... 

ответ

2

Использовать __abstract__ = True без __tablename__ на базовом классе и наследовать от этого.

class HDD(Base): 
    __abstract__ = True 
    _id = ... 

class SDD(HDD): 
    __tablename__ = 'SSDs' 

class SSD2(HDD): 
    __tablename = 'SSDs2' 
+0

Я еще не пробовал этот метод (см. Ниже мое решение), но я могу дать ему шанс в будущем! – ZetaSyanthis

+0

Пробовал тоже, и мне это очень нравится! Очень чистый! – ZetaSyanthis

0

Это выглядит как Бетонная таблица наследование, как описано в Mapping класс иерархий наследования главы SQLAlchemy документации.

+0

Спасибо за вашу помощь, в том числе через IRC. Я сказал вам спасибо в благодарность. :) – ZetaSyanthis

0

Это так, как я в конечном итоге получить эту работу, с помощью inklesspen из #sqlalchemy на Freenode. (Спасибо!)

class ComponentMixin(object): 
    """Pythonic Mixin that defines columns common to most component types.""" 

    _id = Column(
     Integer, 
     doc="Auto-incrementing primary key", 
     name="id", 
     primary_key=True) 
    .... 

    @declared_attr 
    def _server_id(self): # pylint: disable=R0201 
     """ 
     Foreign key to owning server. 

     MUST BE A DECLARED_ATTR since it's a foreign key! 
     """ 

Подкласс наследует ниже:

class HDD(ComponentMixin, ConcreteBase, Base): 
    """Class representing a hard drive.""" 

    __tablename__ = 'HDDs' 

    __mapper_args__ = { 
     'polymorphic_identity': 'hdd', 
     'concrete': True} 
Смежные вопросы