如何实现一个默认的SQLAlchemy Model类,它包含用于继承的常见CRUD方法?

时间:2017-10-26 07:39:36

标签: python inheritance model sqlalchemy default

我想知道是否有可能(和良好做法)实现一个默认的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'

1 个答案:

答案 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