2017-02-07 3 views
1

Ich versuche, zwei Tabellen mit SqlAlchemy, identisch in Bezug auf die Struktur, aber mit anderen Namen zu erstellen.Erstellen Sie zwei verschiedene Tabellen mit dem gleichen Modell

Die Tabellen wie folgt aussehen (vereinfachtes Beispiel):

Base = declarative_base()  

class MyTable(Base, OperationsMixin): 
    __tablename__ = 'the_table_name' 

    colA = Column(BigInteger) 
    colB = Column(TIMESTAMP(timezone=True)) 


class MyTableSecondary(MyTable): 
    pass 

geben MyTableSecondary einen anderen Namen, was ich denke, ich ändern sollte, ist __tablename__ (oder sogar __table__.name und __table__.fullname).

Wenn ich dies jedoch tue, werde ich auch die Werte für die Basisklasse ändern, da all dies Klassenattribute sind.

Um diese Einschränkung zu gehen, ich in dieser Richtung eine returnSecondary auf die Basisklasse könnte hinzufügen:

def returnSecondary(self, suffix): 
    tableArgs = list(self.__table_args__) 
    for a in tableArgs: 
     a.name += suffix 

    classname = self.__class__.__name__ + 'Secondary' 
    class_ = type(classname, 
        tuple(self.__class__.__bases__), 
        {'__tablename__': self.__tablename__ + suffix, 
        '__table_args__': tuple(self.__table_args__)}) 

    return class_ 

Allerdings, wenn ich es nennen, es wirft eine KeyError für die erste Spalte definiert.

Gibt es etwas, das mir fehlt?

Antwort

1

Sie mixin erstellen

class MyTableMixin(object): 
    colA = Column(BigInteger) 
    colB = Column(TIMESTAMP(timezone=True)) 

class MyTable(MyTableMixin, Base): 
    __tablename__ = 'the_table_name' 

class MyTableSecondary(MyTableMixin, Base): 
    __tablename__ = 'secondary_table' 

siehe this example

Wie das Beispiel zeigt, funktioniert das auch im Fall einer Tabelle, die eine Obermenge der Spalten der anderen Tabelle hat. In diesem Fall müssen Sie nur wie üblich neue Spalten hinzufügen:

class MyTableTertiary(MyTableMixin, Base): 
    __tablename__ = 'tertiary_table' 
    some_other_col = Column(Integer) 
+0

Einfach und effektiv. Du hast den Nagel auf den Kopf getroffen! – Jir

Verwandte Themen