我只是想确保升级base
或account
模块一切正常,因为如果我对模块进行了新的更改,我想在将来升级数据库。
我已经在模型account.acount.type
上手动创建了新记录。但是,当我尝试升级account
模块时,引发了在此问题底部写的异常。 Odoo试图从该模型中删除记录。为什么会这样?
我已经安装了帐户模块,但是我没有从该表中删除任何记录,只添加了一些其他类型。所以expected behaviour of upgrading modules with data is:
noupdate表示该模块第二次升级时,此记录将不会再次更新。 noupdate =“ 1”内的记录仅在安装时初始化。
提示:如果您删除了记录,则在下一次更新时系统将重新创建它。通常,在noupdate = 1内部给出的那些类型的记录可能会从前端进行修改。例如,自动调度程序记录。
<data noupdate="1">
<!-- account.account.type -->
<record model="account.account.type" id="data_account_type_receivable">
<field name="name">Receivable</field>
<field name="type">receivable</field>
<field name="include_initial_balance" eval="True"/>
</record>
<!-- [...] -->
这是升级帐户模块时在日志上引发的错误
2018-12-11 20:35:31,729 18018 INFO db_name odoo.addons.base.ir.ir_model: Deleting 59@account.account.type (l10n_es.account_type_third_parties)
2018-12-11 20:35:31,760 18018 ERROR db_name odoo.sql_db: bad query: b'DELETE FROM account_account_type WHERE id IN (59)'
ERROR: null value in column "user_type_id" violates not-null constraint
DETAIL: Failing row contains (14927, Account name or description, null, 4, f, null, other, null, f, null, 1, null, 1, 2018-12-11 18:10:24.091826, 1, 2018-12-11 18:10:24.091826, t).
CONTEXT: SQL statement "UPDATE ONLY "public"."account_account" SET "user_type_id" = NULL WHERE $1 OPERATOR(pg_catalog.=) "user_type_id""
2018-12-11 20:35:31,763 18018 WARNING db_name odoo.modules.loading: Transient module states were reset
2018-12-11 20:35:31,763 18018 ERROR db_name odoo.modules.registry: Failed to load registry
Traceback (most recent call last):
File "/path/to/odoo/src/modules/registry.py", line 85, in new
odoo.modules.load_modules(registry._db, force_demo, status, update_module)
File "/path/to/odoo/src/modules/loading.py", line 414, in load_modules
env['ir.model.data']._process_end(processed_modules)
File "/path/to/odoo/src/linked/base/ir/ir_model.py", line 1628, in _process_end
record.unlink()
File "/path/to/odoo/src/models.py", line 2935, in unlink
cr.execute(query, (sub_ids,))
File "/path/to/odoo/src/sql_db.py", line 155, in wrapper
return f(self, *args, **kwargs)
File "/path/to/odoo/src/sql_db.py", line 232, in execute
res = self._obj.execute(query, params)
psycopg2.IntegrityError: null value in column "user_type_id" violates not-null constraint
This is raised because the account type is being used by some account.
所以唯一的解决方案是使用现有帐户类型而不是创建新帐户类型?
在源代码中是否存在执行此取消链接操作的位置?有人知道吗?
这是正常行为吗?
注意:我已从头开始手动导入会计科目表
答案 0 :(得分:2)
这应该是正常的行为,尤其是对于account.account.type
而言,IIRC根本不是特殊模型。
在模块更新中,odoo始终删除不存在的外部ID的记录。在这种情况下,不存在的外部ID是什么?它们是系统中的外部ID,例如您的l10n_es.account_type_third_parties
,这些ID不再在模块中(此处为l10n_es)。
实际上,这对于odoo开发人员来说是非常重要的信息。我不确定是否在文档中。
关于代码:here
@api.model
def _process_end(self, modules):
""" Clear records removed from updated module data.
This method is called at the end of the module loading process.
It is meant to removed records that are no longer present in the
updated data. Such records are recognised as the one with an xml id
and a module in ir_model_data and noupdate set to false, but not
present in self.loads.
"""
if not modules or tools.config.get('import_partial'):
return True
bad_imd_ids = []
self = self.with_context({MODULE_UNINSTALL_FLAG: True})
query = """ SELECT id, name, model, res_id, module FROM ir_model_data
WHERE module IN %s AND res_id IS NOT NULL AND noupdate=%s ORDER BY id DESC
"""
self._cr.execute(query, (tuple(modules), False))
for (id, name, model, res_id, module) in self._cr.fetchall():
if (module, name) not in self.loads:
if model in self.env:
_logger.info('Deleting %s@%s (%s.%s)', res_id, model, module, name)
record = self.env[model].browse(res_id)
if record.exists():
record.unlink()
else:
bad_imd_ids.append(id)
if bad_imd_ids:
self.browse(bad_imd_ids).unlink()
self.loads.clear()