Flask-SQLAlchemy create_all 如何发现要创建的模型?
How does Flask-SQLAlchemy create_all discover the models to create?
Flask-SQLAlchemy 的 db.create_all()
方法创建每个 table 对应于我定义的模型。我从不实例化或注册模型的实例。它们只是 class 继承自 db.Model
的定义。它怎么知道我定义了哪些模型?
您需要在所有模型所在的同一个模块中调用 create_all()
。如果它们在不同的模块中,您需要在调用 create_all()
之前将它们全部导入。 SQLAlchemy 查看从 db.Model
继承了哪些模型,它只会看到已导入的模型。它将为每个模型创建相应的 table。还解释了here.
Flask-SQLAlchemy 没有什么特别之处,它都是 SQLAlchemy 的标准部分。
正在呼叫 db.create_all
eventually calls db.Model.metadata.create_all
. Tables are associated with a MetaData
instance as they are defined。确切的机制在 SQLAlchemy 中非常迂回,因为有很多幕后簿记正在进行,所以我大大简化了解释。
db.Model
是一个 declarative base class,它有一些特殊的 metaclass 行为。当它被定义时,它会在内部创建一个 MetaData
实例来存储它为模型生成的 tables。当你 subclass db.Model
时,它的 metaclass 行为记录 db.Model._decl_class_registry
中的 class 以及 db.Model.metadata
中的 table .
类 仅在导入包含它们的模块时定义。如果你有一个模块 my_models
写在某处,但它从未被导入,它的代码永远不会执行,所以模型永远不会被注册。
这可能是关于 SQLAlchemy 如何检测模型的一些混淆的来源。子 classes 没有模块 "scanned",不使用 db.Model.__subclasses__
,但是在某处导入模块 是 代码执行所必需的。
- 导入并执行包含模型的模块。
- 模型class定义被执行,subclasses
db.Model
- 模特的 table 已注册
db.Model.metadata
Flask-SQLAlchemy 的 db.create_all()
方法创建每个 table 对应于我定义的模型。我从不实例化或注册模型的实例。它们只是 class 继承自 db.Model
的定义。它怎么知道我定义了哪些模型?
您需要在所有模型所在的同一个模块中调用 create_all()
。如果它们在不同的模块中,您需要在调用 create_all()
之前将它们全部导入。 SQLAlchemy 查看从 db.Model
继承了哪些模型,它只会看到已导入的模型。它将为每个模型创建相应的 table。还解释了here.
Flask-SQLAlchemy 没有什么特别之处,它都是 SQLAlchemy 的标准部分。
正在呼叫 db.create_all
eventually calls db.Model.metadata.create_all
. Tables are associated with a MetaData
instance as they are defined。确切的机制在 SQLAlchemy 中非常迂回,因为有很多幕后簿记正在进行,所以我大大简化了解释。
db.Model
是一个 declarative base class,它有一些特殊的 metaclass 行为。当它被定义时,它会在内部创建一个 MetaData
实例来存储它为模型生成的 tables。当你 subclass db.Model
时,它的 metaclass 行为记录 db.Model._decl_class_registry
中的 class 以及 db.Model.metadata
中的 table .
类 仅在导入包含它们的模块时定义。如果你有一个模块 my_models
写在某处,但它从未被导入,它的代码永远不会执行,所以模型永远不会被注册。
这可能是关于 SQLAlchemy 如何检测模型的一些混淆的来源。子 classes 没有模块 "scanned",不使用 db.Model.__subclasses__
,但是在某处导入模块 是 代码执行所必需的。
- 导入并执行包含模型的模块。
- 模型class定义被执行,subclasses
db.Model
- 模特的 table 已注册
db.Model.metadata