Difference between abstract class Model and Mixin in SQLAlchemy

Viewed 254

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 ?

0 Answers
Related