Mixin in SQLAlchemy can be used to share functionalities and attributes between Models. But as I undersand, it also achieve using inheritance over abstract class. So my question is what is the difference between the following two implementations:
Using abstract Model:
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.ext.declarative import declared_attr,
db = SQLAlchemy()
class BaseModel(db.Model):
__abstract__ = True
@declared_attr
def iid(cls):
return db.Column(
UUID(as_uuid=True),
primary_key=True,
default=uuid.uuid4,
unique=True,
nullable=False,
)
@declared_attr
def created_on(cls):
return db.Column(db.DateTime, server_default=db.func.now())
@declared_attr
def updated_on(cls):
return db.Column(
db.DateTime, server_default=db.func.now(), server_onupdate=db.func.now()
)
def save(self):
db.session.add(self)
db.session.commit()
def delete(self):
db.session.delete(self)
db.session.commit()
class SomeEntity(BaseModel):
some_field = db.Column(db.String)
Using Mixin:
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.ext.declarative import declared_attr,
db = SQLAlchemy()
class Mixin(object):
@declared_attr
def iid(cls):
return db.Column(
UUID(as_uuid=True),
primary_key=True,
default=uuid.uuid4,
unique=True,
nullable=False,
)
@declared_attr
def created_on(cls):
return db.Column(db.DateTime, server_default=db.func.now())
@declared_attr
def updated_on(cls):
return db.Column(
db.DateTime, server_default=db.func.now(), server_onupdate=db.func.now()
)
def save(self):
db.session.add(self)
db.session.commit()
def delete(self):
db.session.delete(self)
db.session.commit()
class SomeEntity(db.Model, Mixin):
some_field = db.Column(db.String)
Are those implementations equivalent ? In which case should I use a Mixin instead of an abstract Model class ?