Odoo 10迁移至Odoo15:filestore与ir_attachment访问异常求助
Odoo 10 迁移至 15:附件内容恢复方案
一、通过store_fname生成datas字段的可行方法
你可以直接从filestore读取文件内容,转为base64格式后填充到ir_attachment的datas字段中,具体步骤如下:
验证filestore完整性
确认新环境的filestore/<数据库名>/目录已完整复制原环境文件,且ir_attachment记录中的store_fname字段值与filestore内的文件路径完全匹配。使用Odoo Shell执行批量更新脚本
打开终端进入Odoo安装目录,执行命令进入数据库shell:./odoo-bin shell -d <你的数据库名称>然后运行以下Python代码:
import base64 import os from odoo import models # 筛选关联hr.inventario且未填充datas的附件 attachments = env['ir.attachment'].search([ ('res_model', '=', 'hr.inventario'), ('datas', '=', False) ]) # 获取当前数据库的filestore绝对路径 filestore_path = env['ir.attachment']._filestore() for att in attachments: if att.store_fname: file_full_path = os.path.join(filestore_path, att.store_fname) if os.path.exists(file_full_path): with open(file_full_path, 'rb') as file: raw_content = file.read() att.write({'datas': base64.b64encode(raw_content)}) else: print(f"未找到文件: {file_full_path}") else: print(f"附件ID {att.id} 无store_fname值,跳过处理")执行完成后,符合条件的附件
datas字段会被自动填充,即可正常访问PDF内容。
二、其他备选方案
- 小数据量手动更新:如果附件数量少,可逐个打开
ir_attachment记录,点击"上传文件"按钮,从filestore中找到对应文件重新上传(不推荐200条数据的场景)。 - 校验导入数据准确性:确认
ir_attachment的res_id、res_model字段与hr.inventario记录完全匹配,避免因关联错误导致无法加载附件。
三、CSV导出报错的解决
你遇到的"Unknown javascript error token <"错误,大概率是导出数据包含HTML特殊字符(如<、>)或数据量过大导致前端渲染异常,可尝试以下方法:
- 缩小导出范围:仅筛选
hr.inventario相关的ir_attachment记录导出,避免全量导出的性能问题。 - 清理特殊字符:检查
ir_attachment的name或其他文本字段,移除<、>等HTML标签或特殊字符后再导出。 - 更换导出方式:使用后台"设置 -> 导出"功能,先导出为Excel格式再转存为CSV,绕过前端导出的JS限制。
注意:所有操作前请务必备份数据库,避免数据丢失或损坏。
内容的提问来源于stack exchange,提问作者Jorge Blasco
相关产品推荐
相关产品推荐

