So I have a bunch of tables using SQLAlchemy that are modelled as objects which inherit from the result to a call to declarative_base()
. Ie:
Ba
It is pretty straigh-forward, you just make declarative_base()
to return a Base
class which inherits from your CommonBase
using cls=
parameter. Also shown in Augmenting The Base docs. Your code might then look similar to below:
class CommonBase(object):
@classmethod
def somecommonaction(cls):
# body here
Base = declarative_base(cls=CommonBase)
class Table1(Base):
# __tablename__ & Table1 specific fields here
class Table2(Base):
# __tablename__ & Table2 specific fields here
SQLAlchemy version 0.7.3 introduced the __abstract__
directive which is used for abstract classes that should not be mapped to a database table, even though they are subclasses of sqlalchemy.ext.declarative.api.Base. So now you create a base class like this:
Base = declarative_base()
class CommonRoutines(Base):
__abstract__ = True
id = Column(Integer, primary_key=True)
def __init__(self):
# ...
Notice how CommonRoutines
doesn't have a __tablename__
attribute. Then create subclasses like this:
class Foo(CommonRoutines):
__tablename__ = 'foo'
name = Column(...)
def __init__(self, name):
super().__init__()
self.name = name
# ...
This will map to the table foo
and inherit the id
attribute from CommonRoutines
.
Source and more information: http://docs.sqlalchemy.org/en/rel_0_7/orm/extensions/declarative.html#abstract
You can use AbstractConcreteBase to make an absract base model:
from sqlalchemy.ext.declarative import AbstractConcreteBase
class AbstractTable(AbstractConcreteBase, Base):
id = db.Column(db.Integer, primary_key=True)
@classmethod
def somecommonaction(cls):
# body here