我們知道對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/
*