升级脚本¶
升级脚本是一个包含名为 migrate()
的函数的 Python 文件,升级过程在模块更新期间会调用该函数。
通常,此函数会执行一个或多个 SQL 查询,并且还可以访问 Odoo 的 ORM 以及 升级工具。
编写升级脚本¶
升级脚本遵循特定的树形结构,并采用命名约定,该约定决定了它们的执行时间。
升级脚本路径的结构为:$module/migrations/$version/pre,post,end-*.py
,其中 $module
是该脚本将要运行的模块,$version
是模块的完整版本(包括 Odoo 的主版本和模块的次版本),而 {pre|post|end}-*.py
是需要执行的文件。文件名将决定该模块和版本的 阶段 以及执行顺序。
注解
从 Odoo 13 开始,升级脚本的顶层目录也可以命名为 upgrades
。这种命名方式更受推荐,因为它具有正确的含义:migrate 可能会被误解为 从 Odoo 中迁移出去。因此,$module/upgrades/$version/
也是有效的路径。
注解
升级脚本仅在模块进行更新时执行。因此,模块中 $version
目录设置的次版本号需要高于模块当前安装的版本号,并且等于或低于模块的更新后版本号。
Example
awesome_partner
自定义模块在 Odoo 17 中升级到版本 2.0
的升级脚本目录结构
awesome_partner/
|-- migrations/
| |-- 17.0.2.0/
| | |-- pre-exclamation.py
两个升级脚本示例,包含 pre-exclamation.py
文件的内容,该文件在合作伙伴名称的末尾添加 “!”:
import logging
_logger = logging.getLogger(__name__)
def migrate(cr, version):
cr.execute("UPDATE res_partner SET name = name || '!'")
_logger.info("Updated %s partners", cr.rowcount)
import logging
from odoo.upgrade import util
_logger = logging.getLogger(__name__)
def migrate(cr, version):
env = util.env(cr)
partners = env["res.partner"].search([])
for partner in partners:
partner.name += "!"
_logger.info("Updated %s partners", len(partners))
请注意,在第二个示例中,脚本利用了 升级工具 来访问 ORM。请查看文档以了解有关此库的更多信息。
升级脚本的阶段¶
升级过程包括每个模块每个版本的三个阶段:
预阶段,在模块加载之前。
后阶段,在模块及其依赖项加载并更新之后。
最终阶段,所有模块均已加载并更新到该版本。
升级脚本根据文件名的第一个部分被分组到相应的阶段中。在每个阶段内,文件按照其字典顺序执行。
一个模块在某一版本中的示例脚本执行顺序
pre-10-do_something.py
pre-20-something_else.py
post-do_something.py
post-something.py
文件
end-01-migrate.py
文件
end-migrate.py