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'
...
这两种方法有什么区别?
答案 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()
。
我相信这些是唯一的区别。