升级自定义数据库

升级到 Odoo 的新版本可能会具有挑战性,尤其是当您使用的数据库包含自定义模块时。本页面的目的是解释带有自定义模块的数据库升级技术流程。有关如何升级不包含自定义模块的数据库的指导,请参阅 升级文档

我们考虑的是一个自定义模块,即任何扩展 Odoo 标准代码且未通过 Studio 应用创建的模块。在升级此类模块之前,或在请求其升级之前,请查看 Service-level agreement (SLA),以确认谁负责该模块的升级。

在进行我们所称的 自定义数据库升级 时,请记住升级的目标:

  1. 保持支持

  2. 获取最新功能

  3. 享受性能提升

  4. 减少技术债务

  5. 从安全改进中受益

在 Odoo 的每个新版本中,都会引入一些更改。这些更改可能会影响已进行自定义开发的模块。这就是为什么升级包含自定义模块的数据库需要额外步骤,以升级源代码的原因。

以下是升级自定义数据库的步骤:

  1. 停止开发并审查它们

  2. 请求升级数据库

  3. 在空数据库上安装您的模块

  4. 在升级后的数据库上使您的模块可安装

  5. 进行充分测试并进行一次演练

  6. 升级生产数据库

第一步:停止开发

开始升级需要投入精力和开发资源。如果在升级过程中持续进行开发,那么每次修改这些功能后都需要重新升级和测试。这就是为什么我们在启动升级流程时建议完全冻结代码库。不用说,修复错误不在此建议范围内。

在停止开发后,建议评估所进行的开发,并将其与当前版本和目标版本之间引入的功能进行比较。尽可能对开发内容提出质疑,并寻找功能上的替代方案。减少你的开发与 Odoo 标准版本之间的冗余,将有助于简化升级过程并降低技术债务。

注解

你可以在 发行说明 中找到不同版本之间的变更信息。

步骤 2:请求升级数据库

在自定义模块的开发工作停止,并且已对实现的功能进行了审查以去除冗余和不必要的代码后,下一步是请求一个升级后的测试数据库。为此,请根据你的数据库托管类型,按照 Obtaining an upgraded test database 中提到的步骤进行操作。

此阶段的目的是不立即在升级后的自定义数据库中开始使用自定义模块,而是确保标准升级过程顺利进行,并且测试数据库已正确交付。如果出现异常,升级请求失败,请通过 支持页面 联系 Odoo 客服,选择与测试升级相关的选项。

第三步:清空数据库

在对升级后的测试数据库进行操作之前,我们建议先在目标升级版本的空数据库上使自定义开发正常运行。这可以确保自定义内容与新版本的 Odoo 兼容,能够分析其行为及与新功能的交互情况,并保证在升级数据库时不会引发任何问题。

在空数据库中使自定义模块正常运行,也有助于避免生产数据库中可能存在的更改和错误配置(如 Studio 自定义、自定义网站页面、邮件模板或翻译)。这些内容与自定义模块本身没有内在关联,可能会在升级过程的这一阶段引发不必要的问题。

为了使自定义模块在空数据库上正常工作,我们建议遵循以下步骤:

  1. 升级自定义/空数据库/可安装模块

  2. 升级自定义数据库/空数据库/测试修复

  3. 升级自定义/空数据库/清理代码

  4. 使标准测试成功运行

如何使自定义模块可安装

第一步是确保自定义模块可以在新版本的 Odoo 中安装。这意味着首先要确保在安装过程中没有出现回溯错误或警告。为此,应在新版本 Odoo 的空数据库中逐一安装自定义模块,并修复由此产生的回溯错误和警告。

此过程将有助于在模块安装过程中检测问题。例如:

  • 无效的模块依赖。

  • 语法变更:资产声明、OWL 更新、attrs 属性。

  • 对不再存在或已重命名的标准字段、模型和视图的引用。

  • Xpath 中已移动或从视图中删除的部分。

  • 重命名或移除的方法

测试和修复

一旦在安装模块时不再出现回溯信息,下一步就是测试这些模块。即使自定义模块可以在空数据库上安装,也不能保证它们在执行过程中没有错误。因此,我们建议对所有自定义内容进行彻底测试,以确保一切按预期正常工作。

此过程将有助于发现那些在模块安装期间未被识别、只能在运行时检测到的问题。例如,对标准 Python 或 OWL 函数的已弃用调用、对不存在的标准字段的引用等。

我们建议对所有自定义内容进行测试,特别是以下元素:

  • 视图

  • 邮件模板

  • 报表

  • 服务器操作和自动操作

  • 标准工作流程的更改

  • 计算字段

我们还建议编写自动化测试,以节省测试迭代的时间,提高测试覆盖率,并确保引入的更改和修复不会破坏现有的流程。如果在自定义中已经实现了测试,请确保它们已升级到新的 Odoo 版本并能成功运行,修复可能存在的问题。

清理代码

在此升级阶段,我们还建议尽可能清理代码。这包括:

  • 删除冗余和不必要的代码。

  • 移除已包含在 Odoo 标准中的功能,如 第一步:停止开发 中所述。

  • 清理不再需要的注释代码。

  • 如果需要,重构代码(函数、字段、视图、报表等)。

标准测试

在完成上述步骤后,我们建议确保所有与自定义模块依赖项相关的标准测试都通过。标准测试可确保代码逻辑的验证并防止数据损坏。它们将帮助您在操作数据库之前识别错误或意外行为。

如果存在标准测试失败的情况,我们建议分析其失败的原因:

  • 自定义修改了标准工作流:根据您的工作流调整标准测试。

  • 自定义未考虑到一种特殊流程:请调整您的自定义,以确保它适用于所有标准工作流程。

第4步:升级数据库

一旦自定义模块在空数据库中可以安装并正常运行,就可以将其在 升级后的数据库 上进行测试了。

为了确保自定义代码在新版本中运行流畅,请按照以下步骤操作:

迁移数据

在升级自定义模块的过程中,您可能需要使用 升级脚本,以将源代码中的更改反映到相应的数据中。除了升级脚本外,您还可以使用 升级工具 及其辅助函数。

  • 在升级自定义代码过程中,如果任何技术数据(如模型、字段、外部标识符)被重命名,则应使用升级脚本进行重命名,以避免在模块升级过程中出现数据丢失。另请参见:rename_field()rename_model()rename_xmlid()

  • 在标准升级过程中,从新版本 Odoo 的源代码和数据库中移除的标准模型数据,如果旧模型表仍然存在,可能需要从旧模型表中恢复。

    Example

    自定义字段对于模型 sale.subscription 在从 Odoo 15 升级到 Odoo 16 时不会自动迁移(当该模型被合并到 sale.order 中时)。在这种情况下,可以在升级脚本中执行一个 SQL 查询,将数据从一个表移动到另一个表。请注意,所有列/字段必须已经存在,因此建议在 post- 脚本中进行此操作(参见 升级脚本的阶段)。

    def migrate(cr, version):
       cr.execute(
          """
          UPDATE sale_order so
             SET custom_field = ss.custom_field
            FROM sale_subscription ss
           WHERE ss.new_sale_order_id = so.id
          """
       )
    

    查看有关 升级脚本 的更多信息。

升级脚本还可以用于:

  • 优化升级的处理时间。例如,对于记录数量过多的模型,可以通过使用 SQL 查询来存储计算字段的值。

  • 在计算其值的方式发生更改的情况下,重新计算字段。有关更多信息,请参见 recompute_fields()

  • 卸载不需要的自定义模块。另请参见 remove_module()

  • 更正错误的数据或错误的配置。

运行和测试升级脚本

由于 Odoo Online 数据库不允许安装包含 Python 文件的自定义模块,因此在此平台上无法运行升级脚本。

测试自定义模块

为了确保自定义模块在升级后的数据库中能够正常工作,它们也需要进行测试。这有助于确保数据库中存储的标准数据和自定义数据保持一致,并且在升级过程中没有丢失任何内容。

需要注意的事项:

  • 视图无法正常工作:在升级过程中,如果某个视图由于其内容导致问题,该视图将被禁用。您可以在“升级报表”中找到有关被禁用视图的信息。此视图需要重新启用(或在不再有用时删除)。为此,我们建议使用升级脚本。

  • 模块数据 未更新:在新数据库中升级模块时,带有 noupdate 标志的自定义记录不会被更新。对于由于新版本更改而需要更新的自定义数据,我们建议使用升级脚本来完成。另请参见:update_record_from_xml()

第五步:测试与演练

当自定义模块在升级后的数据库中正常运行时,进行另一轮测试以评估数据库的可用性并发现之前测试中可能未被注意到的问题至关重要。有关升级后数据库测试的更多信息,请参阅 Testing the new version of the database

升级生产环境 中所述,标准升级脚本和您的数据库都在不断演进。因此,强烈建议您频繁请求新的升级测试数据库,并确保升级过程仍然能够成功。

此外,在升级生产数据库的前一天,进行一次完整的升级流程演练,以避免在升级过程中出现意外行为,并检测迁移数据时可能出现的任何问题。

步骤 6:生产升级

一旦你确认可以升级生产数据库,请根据你的数据库托管类型,按照 Upgrading the production database 中描述的流程进行操作。