python - Flask-SQLAlchemy create_all 如何发现要创建的模型?

标签 python flask sqlalchemy flask-sqlalchemy

Flask-SQLAlchemy 的 db.create_all() 方法创建与我定义的模型相对应的每个表。我从不实例化或注册模型的实例。它们只是继承自 db.Model 的类定义。它怎么知道我定义了哪些模型?

最佳答案

Flask-SQLAlchemy 没有什么特别之处,它都是 SQLAlchemy 的标准部分。

调用 db.create_all最终调用 db.Model.metadata.create_all .表格是 associated with a MetaData instance as they are defined .在 SQLAlchemy 中,确切的机制非常迂回,因为有很多幕后簿记在进行,所以我大大简化了解释。

db.Model 是一个 declarative base class ,它有一些特殊的元类行为。当它被定义时,它会在内部创建一个 MetaData 实例来存储它为模型生成的表。当您子类化 db.Model 时,它的元类行为记录 db.Model._decl_class_registry 中的类以及 db.Model.metadata 中的表>.


类仅在导入包含它们的模块时定义。如果你有一个模块 my_models 写在某处,但它从未被导入,它的代码永远不会执行,所以模型永远不会被注册。

这可能是关于 SQLAlchemy 如何检测模型的一些混淆的来源。没有为子类“扫描”模块,未使用 db.Model.__subclasses__,但代码执行需要在某处导入模块

  1. 导入并执行包含模型的模块。
  2. 模型类定义被执行,子类db.Model
  3. 模型的表已注册到 db.Model.metadata

关于python - Flask-SQLAlchemy create_all 如何发现要创建的模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31082692/

相关文章:

python - Mac OS X 上 pipenv 中带有 matplotlib 的空白图

python - 高效查询多列 SQLAlchemy ORM

python - Boto3上传到s3存储桶

python - 什么时候需要 Queue.join() ?

python - 将一些任意值绑定(bind)到 Flask 中的路由

javascript - 表格为空时 Flask Modal 不工作

python - 来自函数打印的生成器

python - 选择订阅特定用户但该用户未订阅的所有用户

python - sqlalchemy id 相等与引用相等

python - 用 Beautiful Soup 解析 Html 返回空列表