Jir Jir - 1 year ago 51
Python Question

Create two different tables using the same model

I'm trying to create two tables using SqlAlchemy, identical to each other in terms of structure, but with different names.

The tables look like this (simplified example):

Base = declarative_base()

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

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


class MyTableSecondary(MyTable):
pass


To give MyTableSecondary a different name, what I think I should change is
__tablename__
(or even
__table__.name
and
__table__.fullname
).

However, if I do so, I'll change the values for the base class as well, since all those are class attributes.

To go around this limitation, I could add a
returnSecondary
to the base class along these lines:

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_


However, when I call it, it raises a KeyError for the first column defined.

Is there something I'm missing?

Answer Source

You can create mixin

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'

see this example

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download