我想知道是否有可能(和良好做法)实现一个默认的SQLAlchemy Model类,它为其子类提供基本的CRUD功能。我想使用这个基类,以避免不同数据库模型之间的代码重复。
此类功能的一个示例是在DB中创建(并保存)相应模型的实例。我知道这些方法只应用于非相互依赖的交易,以符合原子性原则。这样做有没有内置的机制或解决方法?
这是一个显然不起作用的例子(它唯一的目的是让想法得以实现):
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类中没有主键属性定义,因此引发了以下异常:
sqlalchemy.exc.ArgumentError: Mapper Mapper|DefaultModel|default_model could not assemble any primary key columns for mapped table 'default_model'
答案 0 :(得分:0)
感谢Everllä给我的提示@llja我提出了这个简单的解决方案:
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