如何从Odoo 8克隆数据库至Odoo 10/11?导入导出报错求解决
Odoo跨版本数据库克隆(8→10/11)全指南
嘿,我之前折腾过好几次Odoo从8到高版本的数据库迁移,踩过不少坑,正好能帮你解决问题。先直接给你明确结论:从Odoo8克隆数据库到10/11是可行的,但直接导出导入肯定会报错——因为不同版本的数据库schema、字段类型甚至模型结构都有很大变化,必须按适配步骤来操作。
一、核心问题拆解:为什么直接导出导入会报错?
你遇到的报错,大概率是这几个原因:
- Odoo8和10/11的系统模型字段有变更(比如某些字段被移除、重命名,或者数据类型调整)
- 自定义模块的schema没适配目标版本,导入后找不到对应模型/字段
- 数据里存在无效外键、冗余记录,触发数据库约束检查
二、纯Schema(数据库结构)克隆步骤
如果只需要复制表结构,不需要数据,按下面来:
- 前置准备:在Odoo10/11环境创建全新空数据库,安装好和Odoo8完全一致的模块(包括自定义模块,必须先适配到目标版本)
- 导出Odoo8的Schema:用PostgreSQL命令行导出纯结构(不要数据)
pg_dump -s -d odoo8_database_name > odoo8_schema.sql - 导入到目标数据库:
psql -d odoo11_database_name -f odoo8_schema.sql - 修复兼容性问题:导入后可能会出现字段类型不匹配、约束冲突的报错,比如Odoo8的
boolean字段存储方式和10/11不同,需要手动修改表结构,比如:ALTER TABLE res_partner ALTER COLUMN is_company TYPE boolean USING is_company::boolean;
三、带数据的完整克隆(解决导出导入报错)
如果需要连数据一起迁移,这是最稳妥的流程:
步骤1:清理Odoo8数据库的冗余数据
先在Odoo8里做数据清洗,减少后续报错:
- 删除日志表(
ir_logging)、缓存表(ir_cache)的所有记录 - 检查并删除无效外键记录(比如某个订单关联的客户已被删除),可以用这个SQL排查:
-- 示例:检查res_partner的无效外键 SELECT * FROM res_partner WHERE country_id NOT IN (SELECT id FROM res_country); - 删除测试数据、临时数据,只保留核心业务数据
步骤2:按模型分批导出数据
不要用Odoo后台的全量导出,而是用命令行工具按模块/模型分批导出,确保数据格式更规范:
# Odoo8命令行导出res.partner模型数据为XML格式 python odoo.py -d odoo8_db --export res.partner --format xml --output partners.xml
建议优先导出核心模型(比如客户、产品、订单),再导出关联模型,避免依赖问题。
步骤3:适配数据格式到目标版本
打开导出的XML文件,手动调整不兼容的内容:
- 重命名字段:比如Odoo8里的某些字段在10/11里被重命名(比如
name→display_name) - 移除过时字段:删除Odoo8特有的、目标版本不存在的字段
- 调整关联格式:比如
many2one字段的XML写法在高版本有细微变化
步骤4:在目标环境初始化并导入
- 在Odoo10/11创建新数据库,安装好所有适配后的模块
- 用目标版本的命令行工具导入调整后的XML:
# Odoo11导入命令 python odoo-bin -d odoo11_db --import partners.xml - 针对性解决报错:如果导入时提示某个字段不存在,先检查目标模块是否定义了该字段;如果是外键约束报错,可以临时禁用约束再导入:
-- 临时禁用表的外键约束 ALTER TABLE res_partner DISABLE TRIGGER ALL; -- 导入完成后恢复 ALTER TABLE res_partner ENABLE TRIGGER ALL;
四、关键注意事项
- 模块适配优先:所有自定义模块必须先升级到支持目标Odoo版本的版本,否则导入后肯定会出现模型找不到的错误
- 不要直接复制数据库文件:直接拷贝PostgreSQL的数据目录会导致版本不兼容,绝对不可行
- 备份优先:操作前一定要备份源数据库和目标数据库,避免数据丢失
内容的提问来源于stack exchange,提问作者m.c.dev.96




