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().
我相信这些是唯一的区别.