升级自定义数据库

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

我们认为自定义模块是指任何扩展了Odoo标准代码且未通过Studio应用构建的模块。在升级此类模块或请求升级之前,请查看 服务级别协议(SLA) 以确保谁对此负责。

在处理我们称之为数据库的 自定义升级 时,请记住升级的目标:

  1. 保持支持

  2. 获取最新功能

  3. 享受性能提升

  4. 减少技术债务

  5. 受益于安全改进

随着每个新版本的 Odoo,都会引入一些变化。这些变化可能会影响已开发定制功能的模块。这就是为什么升级包含自定义模块的数据库需要额外的步骤来升级源代码的原因。

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

  1. 停止开发并挑战它们

  2. 请求升级数据库

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

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

  5. 广泛测试并进行演练

  6. 升级生产数据库

第一步:停止开发

开始升级需要承诺和开发资源。如果在升级过程中继续开发新功能,每次更改这些功能时都需要重新升级和测试。这就是为什么我们建议在开始升级过程时完全冻结代码库。当然,错误修复不受此建议的限制。

一旦停止开发,评估已进行的开发并将其与当前版本和目标版本之间引入的功能进行比较是一个良好的做法。尽可能挑战这些开发,并找到功能性的替代方案。消除您的开发与Odoo标准版本之间的冗余将简化升级过程并减少技术债务。

注解

您可以在 发布说明 中找到有关版本之间更改的信息。

Step 2: 请求升级数据库

一旦自定义模块的开发停止,并且已实施的功能经过挑战以去除冗余和不必要的代码,下一步就是请求一个升级的测试数据库。为此,请根据数据库的托管类型,按照 获取升级后的测试数据库 中提到的步骤操作。

此阶段的目的是不在升级后的数据库中开始使用自定义模块,而是确保标准升级过程无缝进行,并且测试数据库正确交付。如果情况并非如此,且升级请求失败,请通过 support page 请求 Odoo 的帮助,选择与测试升级相关的选项。

步骤 3:清空数据库

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

在空数据库中使自定义模块正常工作也有助于避免生产数据库中可能存在的更改和错误配置(如工作室定制、自定义网站页面、电子邮件模板或翻译)。这些内容与自定义模块并无本质关联,但在此升级阶段可能会引发不必要的问题。

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

  1. 使自定义模块可安装

  2. 测试与修复

  3. 清理代码

  4. 确保标准测试成功运行

使自定义模块可安装

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

此过程将有助于检测模块安装期间的问题。例如:

  • 无效的模块依赖关系。

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

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

  • Xpath 被移动或从视图中移除。

  • 方法已重命名或移除。

测试与修复

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

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

我们建议测试所有的定制内容,特别是以下元素:

  • 查看

  • 电子邮件模板

  • 报表

  • 服务器动作和自动化动作

  • 标准工作流中的变更

  • 计算字段

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

清理代码

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

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

  • 移除现已成为 Odoo 标准功能的部分,如 第一步:停止开发 所述。

  • 如果不再需要,清理注释掉的代码。

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

标准测试

完成上述步骤后,我们建议确保与自定义模块依赖相关的所有标准测试通过。标准测试确保代码逻辑的验证并防止数据损坏。它们将帮助你在处理数据库之前识别错误或不希望出现的行为。

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

  • 定制化改变了标准工作流程:将标准测试调整为您的工作流程。

  • 定制未考虑到一个特殊流程:调整您的定制,以确保其适用于所有标准工作流程。

第4步:升级后的数据库

一旦自定义模块在空数据库中可安装并正常运行,就是时候让它们在 升级后的数据库 上工作了。

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

迁移数据

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

  • 在自定义代码升级过程中重命名的任何技术数据(模型、字段、外部标识符)都应使用升级脚本进行重命名,以避免模块升级期间的数据丢失。另请参阅: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()

第5步:测试与演练

当自定义模块在升级后的数据库中正常运行后,进行另一轮测试以评估数据库的可用性并检测可能在之前测试中未注意到的问题至关重要。有关测试升级后数据库的更多信息,请查看 测试新版数据库

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

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

步骤 6: 生产环境升级

一旦您确定要升级生产数据库,请根据数据库的托管类型,按照 升级生产数据库 中描述的流程进行操作。