2016-01-05 70 views
14

我有一些模块可以扩展Odoo的附加组件。例如,在my_module车型,其扩大CRMOdoo。迁移

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 

同样的情况是其扩大小时,产品等 我需要做一些修改模型模块。例如在my_module_1我需要更改几个字段(类型,关系),在my_module_2只是为了移除一些字段等。当然,我也需要改变每个模块的视图。当然,我也有我的自定义模型,它们与来自不同应用程序/模块的模型有依赖关系。但是我有关于必须存储的生产数据。 我在Odoo中找不到有关迁移(或模块同步)的任何信息。

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

回答

0

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

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

将开发的模块安装在本地系统(恢复的数据库)中并查看您所做的更改。如果一切都与现有数据完美匹配,请将该模块安装到生产数据库中。

要转储生产数据库,请在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路径 例子:pg_dump的prod_db> prod_db.sql

+0

我对Postgres或Dump没有任何问题。我会尝试解释...在生产上安装了一些模块。我改变了模型中的一些领域。要查看模型中的更改,需要重新启动“openerp-server”。但服务器无法启动,因为表格和模型的结构不同。如果我们点击'卸载'按钮 - >将模型部署到服务器 - >点击'安装'一切都会好的,但在这种情况下我们会丢失所有数据。所以,我想知道可以创建一些**迁移脚本**并在点击**更新模块**或启动服务器之前使用它们。 –

+0

你是否改变了现有字段模型中的字段数据类型或在模型中添加了新字段? –

+0

我只是在寻找一种快速简便的方式来更新模块。我不能相信没有任何工具可以根据Odoo-models/tables的差异生成迁移。 –

0

也许有在Odoo 企业版迁移一些工具,但我还没有发现这方面有任何的信息。所以我使用的解决方案是手动完成一切。一步一步,专心。如果你知道更好的方式,让我知道。

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

  1. 从您的模块/应用程序中的模型和视图中删除字段。
  2. Stop openerp-server。运行删除我们列的sql。
  3. 将新版本模型和视图部署到服务器。 开始openerp-server
  4. 激活开发者模式 - >进入设置 - >找到你的模块/应用程序 - >点击Update(升级)

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

  1. 向模型中添加一个字段(使用新类型/关系)。
  2. 准备将数据从旧列传输到新列的sql脚本。
  3. 从模型和视图中删除旧字段。
  4. Stop openerp-server。运行sql脚本,删除旧列。
  5. 将新版本模型和视图部署到服务器。 开始openerp-server
  6. 激活开发者模式 - >进入设置 - >找到你的模块/应用程序 - >点击Update(升级)

要小心,当你改变关系(one2many,many2many)。制作应用程序的转储和版本。用db从生产中检查本地机器上的修改几次。

关于新领域的另一件事。例如我有module_1这取决于crmmodule_2取决于module_1等我需要一些字段添加到CRM模型,并显示在module_1。在module_2我需要在module_1中显示我的自定义模型中的新字段。

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

./openerp-server --update=all 

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

./openerp-server --update=crm 
0

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

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

如果你正在处理一个生产服务器,我会用本地生产的新鲜倾倒测试,在开发机器上DB确保它正常工作,如果需要调整它(例如,一些领域可能需要默认值,不管什么),再次在另一个新的转储中测试它,直到我需要做的所有事情都是重新启动服务器,如上所述,以使更改发生。 一旦发生这种情况,请备份生产服务器上的数据库,数据存储区甚至受影响的模块,上载新模块并重新启动生产服务器(此处不要将数据库从测试转储到生产)关心数据库的变化。

如果您试图更改表的结构(例如更改字段数据类型)并在表中保留数据,我唯一能想到的方法是创建添加NEW字段,首先使用新数据类型填充他们与来自旧字段的数据(直接使用postgres查询或在您的“临时版本模块”中),这实际上取决于变化,从选择到many2one的变化涉及将选择值插入到新表中,这两个与第数据库的角度来看,表格上的实际字段类型将是一个整数,从关系表中保存选择值的行的ID ...

一旦您的新字段填充完毕,请将该字段的最终版本模块将删除所有字段不再需要(保留生产数据库的其他版本)。

我可能会首先在开发服务器上手动测试数据库数量,无论是在postgres中还是使用像pgadminIII这样的工具,但是计划在生产服务器上创建一个用于执行该脚本的脚本(或者更好地将其全部构建到新的模块版本),因为在发生这种情况时它将不得不关闭。

在完成所有工作后,我还会查看postgres表,即使新模块没有使用它们,某些字段仍可能存在。

对不起,我不知道这样做,只是有太多变量的任何更简单,更自动化的方式...

+0

它就像我的答案一样,只是使用参数* -d *作为数据库名称。但是,我一直在寻找简单的方法为“从盒子” –

0

按你的榜样,我相信你已经知道如何添加新的领域到现有的模型。

我还是不明白为什么有人会想从现有的模型删除字段 - 这是/将是更多的麻烦比它的价值(如果有正当的理由,请让我知道)。这也适用于重试字段类型的尝试。有了这个说法,你可以非常容易地移除/替换/隐藏视图上的现有字段,这本质上应该可以实现相同的结果。

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 

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

+0

好创建迁移,传输数据等。我有10-50个自定义模块。一些列不被使用。当然,我可以隐藏它(但我认为这是错误的方式)。如何重命名,改变类型/关系等?我可以手动创建sql脚本并执行它们。关于历史,交易呢?我应该手动停止服务器,执行脚本,更新源代码,更新模块并运行服务器?如果模块升级有问题怎么办?这不是现代的方式。 –

+0

据我所知,您不能重命名现有模型上的字段。当你输入一个不同的名字时,它实际上会创建一个新的字段。如果你确实重命名了一个字段,那么它将从模型中删除旧字段,但不从数据库中删除。这意味着模型将具有新的字段,并且数据库将具有两个字段。如果从模型删除字段,那么你也必须从所有视图中删除字段,并且还取消对其中提到已删除的原始字段等车型的任何领域。这也可能会影响您在以后安装的使用已删除字段的任何模块。 – Palza

+0

在关于脚本等 - 你可以在任何时候运行SQL脚本,您首选的时间通常取决于你正在努力完成的任务。问问你自己为什么要在这些脚本运行的时候想要上去或下去。 – Palza