Aug*_*Bar 7 python sqlalchemy flask-sqlalchemy
SQLAlchemy 中的 Mixin 可用于在模型之间共享功能和属性。但据我了解,它还实现了使用抽象类的继承。所以我的问题是以下两种实现之间有什么区别:
使用抽象模型:
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)
Run Code Online (Sandbox Code Playgroud)
使用混合:
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)
Run Code Online (Sandbox Code Playgroud)
这些实现是等效的吗?在什么情况下我应该使用 Mixin 而不是抽象 Model 类?