程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Python >> OpenERP在哪儲存附件?

OpenERP在哪儲存附件?

編輯:Python

我們知道對OpenERP中的每個內部對象(比如:業務伙伴,采購訂單,銷售訂單,發貨單,等等)我們都可以添加任意的附件,如圖片,文檔,視頻等。那麼這些附件在OpenERP內部是如何管理的呢?

默認情況下,這些附件在OpenERP v7中是保存在數據庫中的。我們知道當附件的數量比較大時,這會嚴重影響數據庫的性能。其實在OpenERP 中我們可以通過設置ir.config.parameter參數來使附件保存在文件系統中,具體菜單位置是:”設置-技術-參數-系統參數-ir_attachement.location” (Settings->Technical->Parameters-System parameters- ir_attachment.location)

比如我們將ir_attachment.location設置為file:///filestore

那麼這些附件就會保存在openerp根目錄/filestore下, 系統使用sha1哈希算法來創建文件名所以重復的文件在系統中並不會多占空間。

目前只支持file:///協議,實際上我們可以很容易通過擴增模塊來支持比如amazons3:///協議,這樣我們就可以將附件保存在亞馬遜的S3雲服務了。

數據庫保存附件的模式下,數據是保存在ir_attachment.db_datas
文件系統保存附件的模式下,文件名保存在ir_attachment.db_datas_fname

我們尚為提供這兩種模式的自動轉換機制。所以,如果你設置了這個參數,那麼已存在的附件仍將保存在數據庫中,只有新附件會保存在文件系統中,系統會嘗試訪問這兩個不同的位置,所以也沒什麼問題(先檢查db_datas,然後再檢查db_datas_fname)

注:本文末尾提供的腳本可以自動將現有數據庫中的附件轉換到文件系統中

如果你移除了這個參數,你需要設法將在文件系統中保存的附件存回到數據庫中,因為系統就只會通過數據庫來檢查附件了。

將現有數據庫中的附件數據轉移到文件系統中的腳本(替換URL為您的OpenERP實際訪問URL地址):

#!/usr/bin/python   import xmlrpclib   username = 'admin' #the user pwd = 'password'      #the password of the user dbname = 'database'    #the database   # Get the uid sock_common = xmlrpclib.ServerProxy ('<URL>/xmlrpc/common') uid = sock_common.login(dbname, username, pwd) sock = xmlrpclib.ServerProxy('<URL>/xmlrpc/object')   def migrate_attachment(att_id):     # 1. get data     att = sock.execute(dbname, uid, pwd, 'ir.attachment', 'read', att_id, ['datas'])       data = att['datas']       # Re-Write attachment     a = sock.execute(dbname, uid, pwd, 'ir.attachment', 'write', [att_id], {'datas': data})   # SELECT attachments: att_ids = sock.execute(dbname, uid, pwd, 'ir.attachment', 'search', [('store_fname','=',False)])   cnt = len(att_ids) i = 0 for id in att_ids:     att = sock.execute(dbname, uid, pwd, 'ir.attachment', 'read', id, ['datas','parent_id'])       migrate_attachment(id)     print 'Migrated ID %d (attachment %d of %d)' % (id,i,cnt)     i = i + 1   print "done ..."

運行這個腳本後,我們還需要清除ir_attachements表:

update ir_attachment set db_datas = null where store_fname is not null vacuum (full, analyze) ir_attachment

原文地址:http://cn.openerp.cn/where_to_store_attachement_in_openerp_7/

*
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved