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
扩展hr
、product
等模块也是同样的情况。
我需要对模型进行一些更改。例如,在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企业版中有一些迁移工具,但我没有找到任何相关信息。所以我使用的解决方案是手动完成所有操作。一步一步,用心。如果您知道更好的方法,请告诉我。
例如。如果我们需要删除一些字段:
- 从您的 module/app 中的模型和视图中删除字段。
- 停止openerp-server。 运行 sql 删除我们的专栏。
- 将新版本模型和视图部署到服务器。 开始openerp-server.
- 激活开发者模式 -> 进入设置 -> 找到你的 module/app -> 点击更新(升级)
如果您需要更改 type/relation 个字段:
- 向您的模型添加一个字段(使用新的 type/relation)。
- 准备 sql 脚本,它将数据从旧列传输到新 column/tables。
- 从模型和视图中删除旧字段。
- 停止openerp-server。 运行 sql 脚本,删除旧列。
- 将新版本模型和视图部署到服务器。 开始openerp-server.
- 激活开发者模式 -> 进入设置 -> 找到你的 module/app -> 点击更新(升级)
更改关系时要小心(one2many,many2many)。 制作应用程序的转储和版本。使用来自生产的数据库在本地计算机上检查您的修改几次。
关于具有关系的新字段的另一件事。例如,我有 module_1,这取决于 crm。 module_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 中的迁移时的第一站。
我有一些模块可以扩展 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
扩展hr
、product
等模块也是同样的情况。
我需要对模型进行一些更改。例如,在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企业版中有一些迁移工具,但我没有找到任何相关信息。所以我使用的解决方案是手动完成所有操作。一步一步,用心。如果您知道更好的方法,请告诉我。
例如。如果我们需要删除一些字段:
- 从您的 module/app 中的模型和视图中删除字段。
- 停止openerp-server。 运行 sql 删除我们的专栏。
- 将新版本模型和视图部署到服务器。 开始openerp-server.
- 激活开发者模式 -> 进入设置 -> 找到你的 module/app -> 点击更新(升级)
如果您需要更改 type/relation 个字段:
- 向您的模型添加一个字段(使用新的 type/relation)。
- 准备 sql 脚本,它将数据从旧列传输到新 column/tables。
- 从模型和视图中删除旧字段。
- 停止openerp-server。 运行 sql 脚本,删除旧列。
- 将新版本模型和视图部署到服务器。 开始openerp-server.
- 激活开发者模式 -> 进入设置 -> 找到你的 module/app -> 点击更新(升级)
更改关系时要小心(one2many,many2many)。 制作应用程序的转储和版本。使用来自生产的数据库在本地计算机上检查您的修改几次。
关于具有关系的新字段的另一件事。例如,我有 module_1,这取决于 crm。 module_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 中的迁移时的第一站。