簡體   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