Odoo 迁移

Odoo Migrations

我有一些模块可以扩展 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中,只需删除几个字段等。当然我还需要更改每个模块的视图.当然,我有我的自定义模型,这些模型与来自不同 apps/modules 的模型有依赖关系。但是我有必须存储的生产数据。 我没有在 Odoo 中找到任何关于迁移(或模块同步)的信息。

我的问题是:在生产环境中更新 modules/apps 的最佳方式是什么(如果我们在模型和视图领域有很多变化)? 提前致谢.

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

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

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

要转储生产数据库,请在 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 < infile path 示例:pg_dump prod_db > prod_db.sql

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

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

  1. 从您的 module/app 中的模型和视图中删除字段。
  2. 停止openerp-server。 运行 sql 删除我们的专栏。
  3. 将新版本模型和视图部署到服务器。 开始openerp-server.
  4. 激活开发者模式 -> 进入设置 -> 找到你的 module/app -> 点击更新(升级)

如果您需要更改 type/relation 个字段:

  1. 向您的模型添加一个字段(使用新的 type/relation)。
  2. 准备 sql 脚本,它将数据从旧列传输到新 column/tables。
  3. 从模型和视图中删除旧字段。
  4. 停止openerp-server。 运行 sql 脚本,删除旧列。
  5. 将新版本模型和视图部署到服务器。 开始openerp-server.
  6. 激活开发者模式 -> 进入设置 -> 找到你的 module/app -> 点击更新(升级)

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

关于具有关系的新字段的另一件事。例如,我有 module_1,这取决于 crmmodule_2 这取决于 module_1 等。我需要向 crm[= 添加一些字段57=] 模型并在 module_1 中显示它们。在 module_2 中,我需要在 module_1 中显示自定义模型中的新字段。

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

./openerp-server --update=all

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

./openerp-server --update=crm

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

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

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

如果您尝试大幅度更改 table 的结构(例如更改字段数据类型)并在 table 中保留数据,我能想到的唯一方法是创建首先使用新数据类型添加新字段,用旧字段中的数据填充它们(直接使用 postgres 查询或在您的 "interim version module" 中),这实际上取决于更改,从选择到 many2one 的更改涉及将选择值插入到一个新的 table,从数据库的角度来看,这是两个截然不同的东西 table 上的实际字段类型将是一个整数,在关系 [=26] 中保存选择值的行的 ID =]...

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

我可能会首先在开发服务器上手动测试数据库填充,无论是在 postgres 中还是使用诸如 pgadminIII 之类的工具,但计划创建一个脚本以在生产服务器上执行此操作(或者最好将其全部构建到新模块版本),因为它必须在发生这种情况时关闭。

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

抱歉,我不知道有什么更简单、更自动的方法,变量太多...

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

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

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>

您还谈到通过 copy/paste 将数据从家属迁移到另一个模型。这不是必需的,因为您可以通过直接 object/field 引用或使用相关字段简单地访问现有模型中的数据。

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

我不会解决与安装 module/server 辅助命令有关的任何问题,因为此处的其他答案已经解决了这些方面的问题。

My question is: What is the best way to update modules/apps on production(if we have many changes in fields of models and views)?

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

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

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

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