我在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, inload_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文件出错了,但是当我尝试手动安装模块时遇到同样的错误,我认为其他问题出了问题,但我看不清楚是什么.
干杯
删除模块的代码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
(osv.Model
在OpenERP v7中)派生的对象中定义的模型.它们定义存储在数据库中的持久模型.来自osv.osv_memory
(osv.TransientModel
在v7中)的对象后代不存储在数据库中.
小心并避免删除父对象中定义的模型.查看_inherit
对象的属性以了解相关信息.在这种情况下,您只想删除模块添加的列.
一旦发现模块定义的模型,请尝试删除相应的数据表.例如,模型用
_name = "bg_vat.bg_vat"
将在数据库中有一个名为'bg_vat_bg_vat'的相应表.
最后,删除或仅停用模块.在ir_module_module
datatable中查找与您的模块对应的记录.您可以删除记录或只将state
字段设置为uninstalled
.
如果您愿意,您现在可以删除模块的目录,addons
但我没有理由这样做.
我确定我错过了一些清理操作(比如数据表ir_model*
系列中的记录).我也很确定这个程序很容易破坏你的OpenERP安装.先做备份.:)