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


83

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

app = Flask(__main__)
db = SQLAlchemy(app)
class Users(db.Model):
    __tablename__ = 'users'
    ...

但是,SQLAlchemy教程和bottle-SQLAlchemy README都建议表模型继承从Base实例化declarative_base()

Base = declarative_base()
class Users(Base):
    __tablename__ = 'users'
    ...

这两种方法有什么区别?

Answers:


80

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

self.Model = self.make_declarative_base()

这是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

_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()

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


1
我今天只是在为我已经开发了大约一年的这个应用程序而搜索,最初是基于您的“ Mega Flask教程”,该教程使用db.Model而不是显式使用Base = Declarative_Base。我很困惑,因为我的模型都清楚地使用了Declarative扩展,但是我从未调用过declarative_base()。感谢您的精彩解释!
Chockomonkey,2016年

是否可以在一个用户模型中使用db.Model,在地址模型中使用Base。例如:-类User(db.Model),类Address(Base)?
萨伊夫·阿里·卡雷迪亚

不能确定,但​​是我猜想有些事情将无法正常工作。Flask-SQLAlchemy在db.Model类的基类中添加了一些行为,因此,直接从声明性基类继承的任何模型都不会具有该行为。
米格尔(Miguel)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.