Odoo 迁移

Posted

技术标签:

【中文标题】Odoo 迁移【英文标题】:Odoo Migrations 【发布时间】:2016-04-09 17:26:37 【问题描述】:

我有一些扩展 Odoo 附加组件的模块。例如,my_module 中扩展 crm 的模型:

class Lead(models.Model):
    _inherit = 'crm.lead'
    # exmaple fields
    field_1 = fields.Char(...)
    field_2 = fields.Many2one(...)
    # ... field 99


class Stage(models.Model):
    _inherit = 'crm.stage'
    # exmaple fields
    field_1 = fields.Char(...)
    field_2 = fields.Many2one(...)
    # ... field 99

同样的情况也适用于扩展hrproduct等的模块。 我需要对模型进行一些更改。例如,在my_module_1 中,我需要更改my_module_2 中的几个字段(类型、关系),只是为了删除一些字段等。当然我还需要更改每个模块的视图。当然,我有我的自定义模型,这些模型与来自不同应用程序/模块的模型有依赖关系。但我有必须存储的生产数据。 我没有在 Odoo 中找到任何有关迁移(或模块同步)的信息。

我的问题是:在生产中更新模块/应用程序的最佳方式是什么(如果我们在模型和视图领域有很多变化)?提前致谢。

【问题讨论】:

【参考方案1】:

我的问题是:更新模块/应用程序的最佳方式是什么? 生产(如果我们在模型和视图领域有很多变化)?

虽然这个问题已经存在了一段时间,但我看不到任何规范的答案,因此这是我的两分钱。

在 Odoo 中从一个版本迁移到另一个版本的问题相当普遍,而且非常复杂。考虑到这一点,OpenUpgrade 项目已经创建。 OpenUpgrade 基本上是一个upgrade path,它将帮助您将数据和模型从版本 A 转换到版本 B。例如,如果名为 fieldA 的字段在版本 9 上的类型发生了变化,而您使用的是版本 8,则 OpenUpgrade 将负责通过进行必要的转换来实现。

OpenUpgrade 还使您可以创建自己的迁移脚本,这些脚本将做任何需要做的事情,以便您的模块在各种版本中被向前移植(或向后移植)。对于标准模块,这些脚本已经被编写为扩展,但对于您自己的,您可能需要编写一些代码。

我建议你看看上面的文档,这基本上是你在 Odoo 中讨论迁移时的第一站。


【讨论】:

去年我没有使用Odoo,也没有使用Automated migration script。但我认为你的回答非常有用。它看起来像我一直在寻找的东西。非常感谢!【参考方案2】:

首先您必须转储生产数据库,然后在本地系统中恢复它。

在本地系统中恢复后,开发您的自定义模块以扩展现有模型功能。

在本地系统(恢复的数据库)中安装已开发的模块并查看您所做的更改。如果现有数据一切正常,则将该模块安装在生产数据库中。

要转储生产数据库,请在 postgres 中执行以下命令。 命令:pg_dump dbname > outfile 示例:pg_dump prod_db > prod_db.sql

在还原数据库之前,您必须在本地系统中创建新的数据库。要创建新数据库,请执行以下命令, 命令: createdb --owner owner_name --encoding utf-8 dbname 示例:createdb --owner odoo --encoding utf-8 prod_db

要恢复生产数据库,请在 postgres 中执行以下命令。 命令:psql dbname prod_db.sql

【讨论】:

我对 Postgres 或 Dumps 没有任何问题。我将尝试解释... 在生产中安装了一些模块。我更改了模型中的一些字段。要查看模型的变化需要重启openerp-server。但是服务器不会启动,因为表和模型的结构不同。如果我们点击 uninstall 按钮 -> 将模型部署到服务器 -> 点击 install 一切都会好的,但在这种情况下我们会丢失所有数据。所以,我想知道是否可以创建一些迁移脚本并在我们单击更新模块start server之前使用它们。 您是否更改了现有字段模型中的字段数据类型或在模型中添加了新字段? 我只是在寻找一种快速简便的方法来更新模块。我不敢相信没有工具可以根据不同的 Odoo 模型/表生成迁移。 只有在更改现有字段的数据类型时才会丢失数据,否则所有数据都将保留在数据库中。您只需要更改 xml 视图即可显示新字段值。 好的。尝试添加 5-10 个不同的字段,在视图中显示它们并安装模块。在此尝试删除 2 个字段后,在一个字段中将类型从 selection 更改为 many2one,添加 2 个新字段。要查看更改,您必须重新启动服务器。尝试重新启动。您的模块中会出现错误。【参考方案3】:

使用 -u 和 -d 标志从命令行重新启动服务器一次 例如。

sudo service odoo stop
/path/to/odoo/odoo.py -d <your_db_name> -u custom_module1,custom_module2

如果您正在处理生产服务器,我会在您的开发机器上使用生产数据库的新转储在本地测试它,确保它可以正常工作,如果需要进行调整(例如,某些字段可能需要默认值,无论如何) ,在另一个新的转储上再次测试它,直到我需要做的就是像上面那样重新启动服务器以使更改发生。 一旦发生这种情况,在生产服务器上备份数据库、数据存储甚至受影响的模块,上传新模块并如上所述重新启动生产服务器(这里没有将数据库从测试转储到生产)模块更新应该小心数据库更改。

如果您尝试大幅更改表的结构(例如更改字段数据类型)并在表中保留数据,我能想到的唯一方法是首先使用新数据类型创建添加新字段,然后填充它们使用来自旧字段的数据(直接使用 postgres 查询或在“临时版本模块”中),这实际上取决于更改,从 selection 到 many2one 的更改涉及将选择值插入新表,这是数据库中的两个非常不同的东西表中的实际字段类型将是一个整数,即关系表中保存选择值的行的 ID...

填充新字段后,制作模块的最终版本,删除您不再需要的所有字段(为生产数据库保留其他版本)。

我可能会先在开发服务器上手动测试数据库填充,要么在 postgres 中,要么使用 pgadminIII 之类的工具,但计划在生产服务器上创建一个脚本(或者更好地将其全部构建到新模块中)版本),因为发生这种情况时它必须关闭。

完成后我还会查看我的 postgres 表,即使新模块不使用它们,某些字段可能仍然存在。

对不起,我不知道有什么更简单、更自动化的方法,只是变量太多了......

【讨论】:

这就像我的答案一样,只是使用参数 -d 作为数据库名称。但我一直在寻找简单的方法来创建迁移、传输数据等。'from box'【参考方案4】:

根据您的示例,我相信您已经知道如何向现有模型添加新字段。

我仍然不明白为什么有人要从现有 模型 中删除一个字段 - 这是/将会比它的价值更麻烦(如果有正当理由,请告诉我知道)。这也适用于尝试重铸字段类型。话虽如此,您可以很容易地删除/替换/隐藏视图上的现有字段,这在本质上应该达到相同的结果。

https://www.odoo.com/forum/help-1/question/add-remove-fields-to-inherited-custom-module-72945

<record model="ir.ui.view" id="enter_an_id_here">
    <field name="name">some.text.here.form</field>
    <field name="model">crm.lead</field>
    <field name="inherit_id" ref="crm.external_id_here" />
    <field name="arch" type="xml">
        <field name="name" position="after">
            <field name="your_field_name"/>
        </field>
    </field>
</record>

您还谈到了通过复制/粘贴将数据从依赖项迁移到另一个模型。这不是必需的,因为您可以通过直接对象/字段引用或使用相关字段来简单地访问现有模型中的数据。

related field on odoo?

new_field = fields.Char(string='String', related='product_id.name')
or inside python
value = self.product_id.name

我不会解决任何与安装模块/服务器端命令有关的问题,因为这里的其他答案已经解决了这些方面。

【讨论】:

好的。我有 10-50 个自定义模块。某些列未使用。当然我可以隐藏它(但我认为这是错误的方式)。重命名、更改类型/关系等怎么样?我可以手动创建 sql 脚本并执行它们。历史,交易呢?我应该手动停止服务器、执行脚本、更新源、更新模块并运行服务器?模块升级出现问题怎么办?这不是现代方式。 据我所知,您无法重命名现有模型上的字段。当您输入不同的名称时,它实际上会创建一个新字段。如果您确实重命名了一个字段,那么它将从模型中删除旧字段,但不会从数据库中删除。这意味着模型将具有新字段,而数据库将同时具有。如果您从模型中删除一个字段,那么您还必须从所有视图中删除该字段,并删除其他模型上引用您删除的原始字段的任何字段。这也可能会影响您以后安装的使用已删除字段的任何模块。 关于脚本等 - 您可以随时运行 SQL 脚本,您的首选时间通常取决于您要完成的任务。问问自己,为什么在脚本运行的这段时间里你想要 odoo 向上或向下。 我知道你在上面写了什么。但我不敢相信没有用于迁移的模块。手动创建 sql 脚本或使用第三方工具至少看起来很奇怪。所有现代库和框架都提供了在模型和数据库之间产生差异的可能性,在应用程序之前运行迁移并回滚它们,查看历史记录等。我认为所有解决方案都是手动的,但不是自动的 - 简单的事情太多了。【参考方案5】:

也许Odoo 企业版中有一些迁移工具,但我没有找到任何相关信息。所以我使用的解决方案是手动完成所有操作。一步一步,用心。如果您知道更好的方法,请告诉我。

例如。如果我们需要删除一些字段:

    从模块/应用中的模型和视图中删除字段。 停止 openerp-server。运行删除我们的列的 sql。 将新版本的模型和视图部署到服务器。 启动 openerp-server激活开发者模式 -> 进入设置 -> 找到你的模块/应用 -> 点击更新(升级)

如果您需要更改字段的类型/关系:

    向您的模型添加一个字段(具有新类型/关系)。 准备将数据从旧列传输到新列/表的 sql 脚本。 从您的模型和视图中删除旧字段。 停止 openerp-server。运行 sql 脚本,删除旧列。 将新版本的模型和视图部署到服务器。 启动 openerp-server激活开发者模式 -> 进入设置 -> 找到你的模块/应用 -> 点击更新(升级)

更改关系时要小心(one2many,many2many)。 制作应用程序的转储和版本。使用生产环境中的数据库检查您在本地计算机上的修改几次。

关于具有关系的新领域的另一件事。例如,我有 module_1,它依赖于 crmmodule_2 依赖于 module_1 等。我需要在 crm 模型中添加一些字段并在 module_1 中显示它们。在 module_2 中,我需要在 module_1 中显示我的自定义模型中的新字段。

我们可以将所有新字段添加到模块中的模型和视图中。停止服务器并使用参数 --update 运行服务器,如下所示:

./openerp-server --update=all

在这种情况下,所有模块都将更新。如果我们只需要更新依赖于 crm 的模块,我们只需要更新 crm

./openerp-server --update=crm

【讨论】:

以上是关于Odoo 迁移的主要内容,如果未能解决你的问题,请参考以下文章

迁移到 odoo 14

Odoo10 变化

从 Odoo 8 开始,访问另一个数据库中 OpenERP 对象的数据

华为云计算之rainbow迁移原理

【MongoDB-数据迁移】

什么是数据库迁移