Odoo 9 将二进制字段数据库迁移到文件存储



Odoo 9 自定义模块二进制字段attachment=True参数稍后添加,新记录将存储在文件系统存储中。 二进制字段 一些旧记录附件 = True 未使用,因此未在 ir.attachment 表中创建旧记录条目,并且未保存文件系统。 我想知道如何迁移文件系统存储中的旧记录二进制字段值存储?如何根据旧记录二进制字段值在行中创建/插入ir_attachment记录?是否有可用的脚本?

您必须在配置文件的pg_path中包含postgrebin路径。这将还原包含二进制字段的文件存储

pg_path = D:fxupsynth_Postgresbin

我相信您不再需要像 18 个月前那样对此的解决方案,但我刚刚遇到了同样的问题(数据库中有千兆字节的二进制数据),这个问题出现在 Google 上,所以我想我会分享我的解决方案。

当您设置 attachment=True 时,二进制列将保留在数据库中,但系统将在文件存储中查找数据。这使我无法从OdooAPI访问数据,因此我需要直接从数据库中检索二进制数据,然后使用Odoo将二进制数据重新写入记录,然后最后删除列并清空表。

这是我的脚本,它的灵感来自这个用于迁移附件的解决方案,但这个解决方案适用于任何模型中的任何字段,并从数据库而不是从OdooAPI读取二进制数据。

import xmlrpclib
import psycopg2
username = 'your_odoo_username'
pwd = 'your_odoo_password'
url = 'http://ip-address:8069'
dbname = 'database-name'
model = 'model.name'
field = 'field_name'
dbuser = 'postgres_user'
dbpwd = 'postgres_password'
dbhost = 'postgres_host'
conn = psycopg2.connect(database=dbname, user=dbuser, password=dbpwd, host=dbhost, port='5432')
cr = conn.cursor()
# Get the uid
sock_common = xmlrpclib.ServerProxy ('%s/xmlrpc/common' % url)
uid = sock_common.login(dbname, username, pwd)
sock = xmlrpclib.ServerProxy('%s/xmlrpc/object' % url)
def migrate_attachment(res_id):
# 1. get data
cr.execute("SELECT %s from %s where id=%s" % (field, model.replace('.', '_'), res_id))
data = cr.fetchall()[0][0]
# Re-Write attachment
if data:
data = str(data)
sock.execute(dbname, uid, pwd, model, 'write', [res_id], {field: str(data)})
return True
else:
return False
# SELECT attachments:
records = sock.execute(dbname, uid, pwd, model, 'search', [])
cnt = len(records)
print cnt
i = 0
for res_id in records:
att = sock.execute(dbname, uid, pwd, model, 'read', res_id, [field])
status = migrate_attachment(res_id)
print 'Migrated ID %s (attachment %s of %s) [Contained data: %s]' % (res_id, i, cnt, status)
i += 1
cr.close()
print "done ..."

之后,放下列并在 psql 中清空表。

相关内容

  • 没有找到相关文章

最新更新