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

时间:2014-03-27 20:25:55

标签: python sqlalchemy flask bottle flask-sqlalchemy

Flask-SQLAlchemy插件的quickstart tutorial指示用户创建继承db.Model类的表模型,例如

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

但是,SQLAlchemy tutorial和瓶子-SQLAlchemy README都表明表模型继承了从Base实例化的declarative_base()

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

这两种方法有什么区别?

1 个答案:

答案 0 :(得分:53)

查看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查询的子类。 Flask-SQLAlchemy子类添加了三个SQLAlchemy中不存在的其他查询方法:get_or_404()first_or_404()paginate()

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