Sqlalchemy: avoiding multiple inheritance and having abstract base class

前端 未结 3 1963
轻奢々
轻奢々 2020-12-30 02:20

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         


        
相关标签:
3条回答
  • 2020-12-30 02:46

    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
    
    0 讨论(0)
  • 2020-12-30 02:50

    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

    0 讨论(0)
  • 2020-12-30 03:08

    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
    
    0 讨论(0)
提交回复
热议问题