升级脚本¶
升级脚本是一个包含名为 migrate() 的函数的 Python 文件,升级过程在模块更新期间调用该函数。
通常,该函数执行一个或多个 SQL 查询,还可以访问 Odoo 的 ORM 以及 升级实用程序。
编写升级脚本¶
升级脚本遵循特定的树结构,并具有确定何时执行的命名约定。
升级脚本路径的结构为:file:$module/migrations/$version/{pre,post,end}-*.py,其中`$module`是脚本将运行的模块,$version`是模块的完整版本(包括Odoo的主版本和模块的次版本),`{pre|post|end}-*.py`是需要执行的文件。文件的名称将确定 :ref:`phase <upgrade-scripts/phases> 以及该模块和版本的执行顺序。
注解
从 Odoo 13 开始,升级脚本的顶级目录也可以命名为 upgrades。此命名是首选,因为它具有正确的含义:迁移 可能与*移出 Odoo* 相混淆。因此 $module/upgrades/$version/ 也是有效的。
注解
升级脚本仅在模块更新时执行。因此,在 $version 目录中设置的模块次版本需要高于模块的已安装版本,并且等于或低于模块的更新版本。
Example
Odoo 17 上名为 awesome_partner 的自定义模块升级到版本 2.0 的升级脚本的目录结构。
awesome_partner/
|-- migrations/
| |-- 17.0.2.0/
| | |-- pre-exclamation.py
两个升级脚本示例,内容为:file: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.pypre-20-something_else.pypost-do_something.pypost-something.pyend-01-migrate.pyend-migrate.py