如何实现包含用于继承的常见 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