繁体   English   中英

使用 Python3 和 xmlrpc 恢复 Odoo 数据库失败

[英]Restoring an Odoo Database with Python3 and xmlrpc failing

我正在编写一个 python 脚本来备份和恢复 Odoo 数据库(复制,真的)。

我进行备份的代码如下:

def download_db() :
    conn = ServerProxy(url + '/xmlrpc/db')
    print ('Dumping database...')

    with open(backup_zip_name, 'wb') as backup_file:
        decode = base64.b64decode(conn.dump(master_password, db_to_copy, 'zip'))
        backup_file.write(decode)

这似乎工作正常,我可以使用 odoo Web 数据库管理器界面手动成功恢复生成的备份文件。

但是,当我尝试通过脚本恢复该备份时:

def restore_db() :
    with open(backup_zip_name, 'rb') as backup_file:
        serv = ServerProxy(url + '/xmlrpc/db')
        print('Creating database ' + new_db_name + ' from ' + backup_zip_name)
        
        serv.restore(master_password, new_db_name, base64.b64encode(backup_file.read()))
        print('done')

我收到以下错误:

从 ./backup/backup.zip 回溯(最近一次调用最后一次)创建数据库 db_copy:文件“/usr/bin/anonymisation/odoo-database-copy.py”,第 97 行,在 restore_db() 文件“/usr/bin /anonymisation/odoo-database-copy.py", line 40, in restore_db serv.restore(master_password, new_db_name, encode) 文件 "/opt/rh/rh-python36/root/usr/lib64/python3.6/xmlrpc/ client.py”,第 1112 行,在调用中返回 self.__send(self.__name, args) 文件“/opt/rh/rh-python36/root/usr/lib64/python3.6/xmlrpc/client.py”,行1452,在 __request verbose=self.__verbose 文件“/opt/rh/rh-python36/root/usr/lib64/python3.6/xmlrpc/client.py”,第 1154 行,在请求中返回 self.single_request(host, handler , request_body, 详细) 文件“/opt/rh/rh-python36/root/usr/lib64/python3.6/xmlrpc/client.py”,第 1170 行,在 single_request 中返回 self.parse_response(resp) 文件“/opt/ rh/rh-python36/root/usr/lib64/python3.6/xmlrpc/client.py”,第 1342 行,在 parse_response 返回 u.close() 文件“/opt/rh/rh-python36/root/usr/lib64 /python3.6/xmlrpc/cl ient.py", line 656, in close raise Fault(**self._stack[0]) xmlrpc.client.Fault: <Fault object of type 'Binary' has no len(): 'Traceback (last last call last) :\\n 文件 "/opt/rh/rh-python36/root/usr/lib/python3.6/site-packages/odoo-12.0.post20181107-py3.6.egg/odoo/addons/base/controllers/rpc. py”,第 54 行,在 xmlrpc_1\\n response = self._xmlrpc(service)\\n 文件“/opt/rh/rh-python36/root/usr/lib/python3.6/site-packages/odoo-12.0.post20181107 -py3.6.egg/odoo/addons/base/controllers/rpc.py", line 43, in _xmlrpc\\n result = dispatch_rpc(service, method, params)\\n File "/opt/rh/rh-python36/ root/usr/lib/python3.6/site-packages/odoo-12.0.post20181107-py3.6.egg/odoo/http.py", line 120, in dispatch_rpc\\n result = dispatch(method, params)\\n文件“/opt/rh/rh-python36/root/usr/lib/python3.6/site-packages/odoo-12.0.post20181107-py3.6.egg/odoo/service/db.py”,第448行,在dispatch\\n return gexp_method_name\\n File "", line 2, in exp_restore\\n File "/opt/rh/rh-python36/root/usr/lib/python3.6/site-packages/o doo-12.0.post20181107-py3.6.egg/odoo/service/db.py", line 40, in if_db_mgt_enabled\\n return method(self, *args, **kwargs)\\n File "/opt/rh/rh -python36/root/usr/lib/python3.6/site-packages/odoo-12.0.post20181107-py3.6.egg/odoo/service/db.py", line 248, in exp_restore\\n for chunk in chunks(数据):\\n 文件“/opt/rh/rh-python36/root/usr/lib/python3.6/site-packages/odoo-12.0.post20181107-py3.6.egg/odoo/service/db.py” ,第 244 行,分块\\n for i in range(0, len(d), n):\\nTypeError: 'Binary' 类型的对象没有 len()\\n'>

我正在使用 python 3.6 运行脚本。 任何想法如何解决这个问题?

ETA:它们都可以在 python 2.7 上正常工作

base64.b64encode在 python2.7 中返回一个字符串,base64.b64encode返回一个字节

尝试将字符串而不是字节传递给restore函数:

base64.b64encode(backup_file.read()).decode()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM