为什么我在Odoo 10中更新某个模块时,该模块引入的数据记录会被删除?

人气:637 发布:2022-10-16 标签: xml postgresql odoo odoo-10

问题描述

我刚刚在Odoo10中恢复了一个数据库,我甚至从服务器复制了实例和viralenv的源代码,以保护环境。还原工作正常,我可以使用数据库了。

但是我想更新所有模块,并且在更新其中一些模块时遇到一些严重错误。例如,当我尝试仅更新一个模块(l10n_es)时,收到以下错误:

dono.addons.base.ir.ir_model:删除24@account t.account t.type(l10n_es.account_type_ingresos_neto) dono.sql_db:错误查询:DELETE FROM ACCOUNT_ACCOUNT_TYPE WHERE ID IN (24)…… NotNullViolation:列";user_type_id";中的空值违反 非空约束详细信息:失败的行包含(712,NULL,OTHER, 首页--期刊主要分类--期刊细介绍--期刊题录与文摘--期刊详细文摘内容 1,NULL,900000000-02-01 09:28:54.453977,NULL,2018-02-01 09:28:54.453977,空,f)。上下文:SQL语句仅更新(&Q;;UPDATE) 用户集";public";.";account_account";_type_id=NULL,其中$1 运算符(PG_CATALOG.=)&QOT;USER_TYPE_ID&QOOT;

在进行更新之前,我进行了以下查询:

SELECT * FROM ir_model_data WHERE model='account.account.type' AND res_id=24;

返回以下内容:

  id  | create_uid |        create_date         |         write_date         | write_uid | noupdate |            name            |      date_init      |     date_update     | module  |        model         | res_id 
------+------------+----------------------------+----------------------------+-----------+----------+----------------------------+---------------------+---------------------+---------+----------------------+--------
 7850 |          1 | 2018-02-01 09:19:01.412377 | 2021-02-08 15:28:04.013464 |         1 | f        | account_type_ingresos_neto | 2018-02-01 09:19:01 | 2021-02-08 15:28:04 | l10n_es | account.account.type |     24

然后我执行以下命令:

SELECT * FROM account_account_type WHERE id=24;

返回:

 id | create_uid |           name           | write_uid | note |         write_date         |        create_date         | include_initial_balance | type  
----+------------+--------------------------+-----------+------+----------------------------+----------------------------+-------------------------+-------
 24 |          1 | Ingresos patrimonio neto |         1 |      | 2021-02-08 15:28:04.013464 | 2018-02-01 09:19:01.412377 | t                       | other

通过这两个查询,我确认了数据库中有一个ID为24的帐户类型,名为Ingresos parmonio Neto,其外部XML ID为l10n_es.account_type_ingresos_neto

如果我检查实例的代码,l10n_es模块有一个文件夹data,其中有一个名为account_type.xml的文件。此文件由__manifest__.py调用并创建记录:

<record id="account_type_ingresos_neto" model="account.account.type">
    <field name="name">Ingresos patrimonio neto</field>
    <field name="include_initial_balance" eval="True"/>
</record>

所以,我不明白为什么当我更新模块时,它会删除此记录(此事实会产生错误):

odoo.addons.base.ir.ir_model: Deleting 24@account.account.type (l10n_es.account_type_ingresos_neto)

我认为当更新模块时,它会删除其外部XML ID(在数据库中)不再在代码中的记录(由它引入),如下所示:Why is the account module upgrade unlinking records on some tables?

我更新模块时,模块为什么删除仍具有XML ID的现有记录?

推荐答案

明确答案

最后,我意识到我在Odoo实例中重复了两次有罪模块(l10n_es)。它位于addons_path参数调用的两个不同路径中。

对于10.0版的l10n_es,Odoo Community Association将模块放在两个不同的存储库中:OCBl10n-spain。Odoo的更高版本不是这种情况,在这些版本中,OCA使用OCBl10n_es,而不创建自己的l10n_es

旧答案

ir_model_data(问题中引用的链接的解决方案)中更改模块或名称的问题在于,我们更改的那些记录可以在模块更新时重复。

我的解决方案是对冲突记录执行以下查询:

UPDATE ir_model_data SET noupdate=TRUE WHERE module='l10n_es' AND name='account_type_ingresos_neto';

这样,更新模块时不会删除记录,因此,其他记录(将其设置为外键)不会引发NOT NULL错误。

实际上,我认为模块l10n_es应该在加载新记录的某些XML文件中将<data>标记更改为<data noupdate="1">

但实际上,我不知道这是否是最好的解决方案。

325