如何实现包含用于继承的常见 CRUD 方法的默认 SQLAlchemy 模型 class?
How to implement a default SQLAlchemy Model class that contains common CRUD methods for inheritance?
我想知道是否有可能(和良好实践)实现默认的 SQLAlchemy 模型 class,为其子 class 提供基本的 CRUD 功能。我想使用这个基础 class 以避免不同数据库模型之间的代码重复。
此类功能的一个示例是在数据库中创建(并保存)相应模型的实例。我知道这种方法应该只用于非相互依赖的事务,以符合原子性原则。是否有任何内置机制或解决方法来执行此操作?
这里有一个显然行不通的例子(它的唯一目的是为了让大家理解这个想法):
import flask
import flask_sqlalchemy
import sqlalchemy
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
# app.config['SQLALCHEMY_DATABASE_URI'] = ...
db = SQLAlchemy(app)
class DefaultModel(db.Model):
def create(self, **attributes):
try:
# should be considered pseudocode
instance = self._init_(attributes)
db.session.add(instance)
db.session.commit()
return instance
except sqlalchemy.exc.SQLAlchemyError:
db.session.rollback()
return None
class MyModel(DefaultModel):
__tablename__ = 'mytable'
id = db.Column(db.BigInteger(), primary_key=True)
# ...
由于 DefaultModel class 中没有主键属性定义,引发了以下异常:
sqlalchemy.exc.ArgumentError: Mapper Mapper|DefaultModel|default_model could not assemble any primary key columns for mapped table 'default_model'
感谢@llja Everilä 给我的提示,我想到了这个简单的解决方案:
class DefaultModel(db.Model):
__abstract__ = True
def __init__(self, persist=False, **kvargs):
super(DefaultModel, self).__init__(**kvargs)
try:
if persist:
db.session.add(self)
db.session.commit()
except sqlalchemy.exc.SQLAlchemyError as error:
db.session.rollback()
raise error
我想知道是否有可能(和良好实践)实现默认的 SQLAlchemy 模型 class,为其子 class 提供基本的 CRUD 功能。我想使用这个基础 class 以避免不同数据库模型之间的代码重复。
此类功能的一个示例是在数据库中创建(并保存)相应模型的实例。我知道这种方法应该只用于非相互依赖的事务,以符合原子性原则。是否有任何内置机制或解决方法来执行此操作?
这里有一个显然行不通的例子(它的唯一目的是为了让大家理解这个想法):
import flask
import flask_sqlalchemy
import sqlalchemy
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
# app.config['SQLALCHEMY_DATABASE_URI'] = ...
db = SQLAlchemy(app)
class DefaultModel(db.Model):
def create(self, **attributes):
try:
# should be considered pseudocode
instance = self._init_(attributes)
db.session.add(instance)
db.session.commit()
return instance
except sqlalchemy.exc.SQLAlchemyError:
db.session.rollback()
return None
class MyModel(DefaultModel):
__tablename__ = 'mytable'
id = db.Column(db.BigInteger(), primary_key=True)
# ...
由于 DefaultModel class 中没有主键属性定义,引发了以下异常:
sqlalchemy.exc.ArgumentError: Mapper Mapper|DefaultModel|default_model could not assemble any primary key columns for mapped table 'default_model'
感谢@llja Everilä 给我的提示,我想到了这个简单的解决方案:
class DefaultModel(db.Model):
__abstract__ = True
def __init__(self, persist=False, **kvargs):
super(DefaultModel, self).__init__(**kvargs)
try:
if persist:
db.session.add(self)
db.session.commit()
except sqlalchemy.exc.SQLAlchemyError as error:
db.session.rollback()
raise error