升级脚本

升级脚本是一个包含名为 migrate() 函数的 Python 文件,升级过程会在模块更新期间调用该函数。

migrate(cr, version)
参数
  • cr (Cursor) – 当前数据库游标

  • version (str) – 模块的已安装版本

通常,此函数执行一个或多个 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。查阅文档以了解更多关于此库的信息。

升级脚本的阶段

升级过程包括每个模块每个版本的三个阶段:

  1. 预阶段,在模块加载之前。

  2. 后阶段,在模块及其依赖项加载并更新之后。

  3. 结束阶段,在所有模块针对该版本加载并更新之后。

升级脚本根据文件名的第一部分被分组到相应的阶段。在每个阶段内,文件按照字典顺序执行。

一个模块在一个版本中的示例脚本执行顺序

  1. pre-10-do_something.py

  2. pre-20-something_else.py

  3. post-do_something.py

  4. post-something.py

  5. end-01-migrate.py

  6. end-migrate.py