我在openerp v7上安装了一个我想要卸载的模块。
使用界面失败,我在卸载过程中收到错误。
是否有“手动”方式卸载模块?是否足以删除addons/
下的模块文件夹,或者还有其他任何事情要做,以最干净的方式制作吗?
以下是我尝试通过界面卸载模块时出现的错误:
Client Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/openerp-7.0_20131016_232725- py2.7.egg/openerp/addons/web/http.py", line 204, in dispatch
response["result"] = method(self, **self.params)
File "/usr/local/lib/python2.7/dist-packages/openerp-7.0_20131016_232725- py2.7.egg/openerp/addons/web/controllers/main.py", line 1132, in call_button
action = self._call_kw(req, model, method, args, {})
File "/usr/local/lib/python2.7/dist-packages/openerp-7.0_20131016_232725- py2.7.egg/openerp/addons/web/controllers/main.py", line 1120, in _call_kw
return getattr(req.session.model(model), method)(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/openerp-7.0_20131016_232725- py2.7.egg/openerp/addons/web/session.py", line 42, in proxy
result = self.proxy.execute_kw(self.session._db, self.session._uid, self.session._password, self.model, method, args, kw)
File "/usr/local/lib/python2.7/dist-packages/openerp-7.0_20131016_232725- py2.7.egg/openerp/addons/web/session.py", line 30, in proxy_method
result = self.session.send(self.service_name, method, *args)
File "/usr/local/lib/python2.7/dist-packages/openerp-7.0_20131016_232725- py2.7.egg/openerp/addons/web/session.py", line 103, in send
raise xmlrpclib.Fault(openerp.tools.ustr(e), formatted_info)
Server Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/openerp-7.0_20131016_232725- py2.7.egg/openerp/addons/web/session.py", line 89, in send
return openerp.netsvc.dispatch_rpc(service_name, method, args)
File "/usr/local/lib/python2.7/dist-packages/openerp-7.0_20131016_232725- py2.7.egg/openerp/netsvc.py", line 292, in dispatch_rpc
result = ExportService.getService(service_name).dispatch(method, params)
File "/usr/local/lib/python2.7/dist-packages/openerp-7.0_20131016_232725- py2.7.egg/openerp/service/web_services.py", line 626, in dispatch
res = fn(db, uid, *params)
File "/usr/local/lib/python2.7/dist-packages/openerp-7.0_20131016_232725- py2.7.egg/openerp/osv/osv.py", line 188, in execute_kw
return self.execute(db, uid, obj, method, *args, **kw or {})
File "/usr/local/lib/python2.7/dist-packages/openerp-7.0_20131016_232725- py2.7.egg/openerp/osv/osv.py", line 131, in wrapper
return f(self, dbname, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/openerp-7.0_20131016_232725- py2.7.egg/openerp/osv/osv.py", line 197, in execute
res = self.execute_cr(cr, uid, obj, method, *args, **kw)
File "/usr/local/lib/python2.7/dist-packages/openerp-7.0_20131016_232725- py2.7.egg/openerp/osv/osv.py", line 185, in execute_cr
return getattr(object, method)(cr, uid, *args, **kw)
File "/usr/local/lib/python2.7/dist-packages/openerp-7.0_20131016_232725- py2.7.egg/openerp/addons/base/module/module.py", line 495, in button_immediate_uninstall
return self._button_immediate_function(cr, uid, ids, self.button_uninstall, context=context)
File "/usr/local/lib/python2.7/dist-packages/openerp-7.0_20131016_232725- py2.7.egg/openerp/addons/base/module/module.py", line 475, in _button_immediate_function
_, pool = pooler.restart_pool(cr.dbname, update_module=True)
File "/usr/local/lib/python2.7/dist-packages/openerp-7.0_20131016_232725- py2.7.egg/openerp/pooler.py", line 39, in restart_pool
registry = RegistryManager.new(db_name, force_demo, status, update_module)
File "/usr/local/lib/python2.7/dist-packages/openerp-7.0_20131016_232725- py2.7.egg/openerp/modules/registry.py", line 218, in new
openerp.modules.load_modules(registry.db, force_demo, status, update_module)
File "/usr/local/lib/python2.7/dist-packages/openerp-7.0_20131016_232725- py2.7.egg/openerp/modules/loading.py", line 354, in load_modules
loaded_modules, update_module)
File "/usr/local/lib/python2.7/dist-packages/openerp-7.0_20131016_232725- py2.7.egg/openerp/modules/loading.py", line 256, in load_marked_modules
loaded, processed = load_module_graph(cr, graph, progressdict, report=report, skip_modules=loaded_modules, perform_checks=perform_checks)
File "/usr/local/lib/python2.7/dist-packages/openerp-7.0_20131016_232725- py2.7.egg/openerp/modules/loading.py", line 188, in load_module_graph
load_data(module_name, idref, mode)
File "/usr/local/lib/python2.7/dist-packages/openerp-7.0_20131016_232725- py2.7.egg/openerp/modules/loading.py", line 76, in <lambda>
load_data = lambda *args: _load_data(cr, *args, kind='data')
File "/usr/local/lib/python2.7/dist-packages/openerp-7.0_20131016_232725- py2.7.egg/openerp/modules/loading.py", line 124, in _load_data
tools.convert_xml_import(cr, module_name, fp, idref, mode, noupdate, report)
File "/usr/local/lib/python2.7/dist-packages/openerp-7.0_20131016_232725-py2.7.egg/openerp/tools/convert.py", line 945, in convert_xml_import
relaxng.assert_(doc)
File "lxml.etree.pyx", line 3027, in lxml.etree._Validator.assert_ (src/lxml/lxml.etree.c:129517)
AssertionError: Did not expect text in element record content, line 33
对不起这条漫长的痕迹..
起初我怀疑其中一个xml文件出错了,但是当我尝试手动安装模块时出现同样的错误,我认为其他问题出了问题,但我看不清楚。
干杯
答案 0 :(得分:8)
从addons/
删除模块的代码是不够的 - 这将破坏OpenERP。
解决方案1 - 尝试解决正常卸载期间出现的错误
建议使用此方法,因为OpenERP可以干净地完成工作。查看卸载过程中出现的错误,并尝试设想可能出现的问题。在此处发布错误跟踪以获得进一步的帮助。
解决方案2 - 手动卸载
我的程序基于OpenERP v6.0,但它在OpenERP v7中应该非常相似。
备份您的数据库:)。做吧。在此过程中你很可能会破坏某些东西。
查找在安装或更新模块期间创建的记录。
查看__openerp__.py
以查看安装和更新模块时要考虑的XML文件。或者,考虑模块目录中的所有XML文件。
在安装或更新期间搜索此模块创建的记录。这些文件中应该有<record ...model='...'>
之类的XML元素。 model
属性告诉您记录所在的数据表。如果您使用的是类Unix系统,可以在模块的根目录中尝试以下命令:
grep -r -n -A 5 --include="*.xml" \<record *
删除这些记录。您将使用某些数据库界面工具,例如PgAdmin
或pqsl
,并查找上一步中发现的记录。
例如,以下XML行定义ir_cron
数据表中的记录:
<record model="ir.cron" id="ir_cron_account_fiscalyear_close">
知道了,您可以根据XML文件中为此记录定义的数据找到记录。
查找并删除模块定义的所有菜单项。如上所述,在XML文件中搜索<menuitem ...>
元素。在ir_ui_menu
数据表中查找相关记录。
了解模块定义的models
。请尝试以下命令:
grep -r -n -C 5 --include="*.py" "_name = " *
仅关注从osv.osv
(OpenERP v7中的osv.Model
)派生的对象中定义的模型。它们定义存储在数据库中的持久模型。来自osv.osv_memory
(v7中的osv.TransientModel
)的后代对象不存储在数据库中。
小心并避免删除父对象中定义的模型。查看对象的_inherit
属性,以便了解相关信息。在这种情况下,您只想删除模块添加的列。
一旦发现模块定义的模型,请尝试删除相应的数据表。例如,带
的模型 _name = "bg_vat.bg_vat"
将在数据库中有一个名为'bg_vat_bg_vat'的相应表。
最后,删除或仅停用模块。在ir_module_module
数据表中查找与您的模块对应的记录。您可以删除记录,也可以将state
字段设置为uninstalled
。
如果您愿意,现在可以从addons
删除模块的目录,但我没有理由这样做。
我确定我错过了一些清理操作(例如ir_model*
数据表系列中的记录)。我也很确定这个程序很容易破坏你的OpenERP安装。先做备份。 :)
答案 1 :(得分:4)
有两种方式
https://github.com/odoo/odoo/pull/12373.patch(git apply /home/user/patch_file.patch)
手动:
1.前往终端&gt;
psql db_name
并执行以下查询:update ir_module_module set state='to remove' where name='module_name' and state='installed';
2.在this line
之前的loading.py中添加update_module=True
然后运行odoo.py或odoo-bin。
这将正确安全地卸载模块。
享受odoo。 如果您遇到任何问题,请告诉我。
答案 2 :(得分:0)
执行 odoo-bin
脚本(您已从 github.com 上的存储库克隆)并启动 Odoo Shell 并传递您的数据库名称(本示例中的 odoo)
odoo/odoo-bin shell -c conf/odoo.conf -d odoo
最后你应该看到这个输出:
env: <odoo.api.Environment object at 0x7f601d28b410>
odoo: <module 'odoo' from '/opt/odoo-prod/odoo-server/odoo/__init__.py'>
openerp: <module 'odoo' from '/opt/odoo-prod/odoo-server/odoo/__init__.py'>
self: res.users(1,)
Python 3.7.9 (default, Jun 16 2021, 20:25:14)
[GCC 10.2.0] on Linux
Type "help", "copyright", "credits" or "license" for more information.
(Console)
>>>
现在可以调用 Odoo API 来安装、升级或卸载插件。
self.env['ir.module.module'].search([('name', '=', 'crm')]).button_immediate_install()
或
self.env['ir.module.module'].search([('name', '=', 'crm')]).button_immediate_upgrade()
或
self.env['ir.module.module'].search([('name', '=', 'crm')]).button_immediate_uninstall()
来源:https://www.odoo.com/forum/help-1/how-to-uninstall-a-module-from-command-line-36076