declarative_base()和db.Model有什么区别?

drs*_*drs 70 python sqlalchemy bottle flask flask-sqlalchemy

Flask-SQLAlchemy插件的快速入门教程指示用户创建继承db.Model该类的表模型,例如

app = Flask(__main__)
db = SQLAlchemy(app)
class Users(db.Model):
    __tablename__ = 'users'
    ...
Run Code Online (Sandbox Code Playgroud)

但是,SQLAlchemy教程和bottle-SQLAlchemy 自述文件都建议表模型继承Base实例化declarative_base().

Base = declarative_base()
class Users(Base):
    __tablename__ = 'users'
    ...
Run Code Online (Sandbox Code Playgroud)

这两种方法有什么区别?

Mig*_*uel 66

查看Flask-SQLAlchemy源代码,db.Model该类初始化如下:

self.Model = self.make_declarative_base()
Run Code Online (Sandbox Code Playgroud)

这是make_declarative_base()方法:

def make_declarative_base(self):
    """Creates the declarative base."""
    base = declarative_base(cls=Model, name='Model',
                            metaclass=_BoundDeclarativeMeta)
    base.query = _QueryProperty(self)
    return base
Run Code Online (Sandbox Code Playgroud)

_BoundDeclarativeMeta元类是SQLAlchemy中的一个子类DeclarativeMeta,它只是增加了计算的默认值的支持__tablename__(表名),并处理绑定.

base.query属性使基于Flask-SQLAlchemy的模型能够访问查询对象Model.query而不是SQLAlchemy session.query(Model).

_QueryProperty查询类也从SQLAlchemy的的查询的子类.砂箱SQLAlchemy的子类补充说,不存在SQLAlchemy的另外三个查询方法:get_or_404(),first_or_404()paginate().

我相信这些是唯一的区别.