You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在创建Postgres备份时覆盖/移除指定数据(参考Odoo.Sh逻辑)

实现Odoo备份时自定义数据归档/移除的方案

方法一:继承备份向导(推荐,适配Odoo原生备份流程)

直接继承Odoo自带的base.backup临时模型,在备份执行前后插入自定义数据处理逻辑,确保线上数据不会被永久修改:

  1. 创建自定义模块,继承base.backup模型,利用上下文管理器处理数据的临时修改与恢复:
from odoo import models
from contextlib import contextmanager

class BaseBackup(models.TransientModel):
    _inherit = 'base.backup'

    @contextmanager
    def _temp_archive_custom_data(self):
        # 1. 保存待归档记录的原始状态
        custom_model = self.env['your.custom.model']
        target_records = custom_model.search([('your_filter_condition', '=', True)])
        original_states = [(rec.id, rec.state) for rec in target_records]
        
        # 2. 执行归档操作
        target_records.write({'state': 'archived'})
        
        try:
            yield  # 执行备份操作
        finally:
            # 3. 恢复原始状态,避免影响线上业务
            for rec_id, orig_state in original_states:
                custom_model.browse(rec_id).write({'state': orig_state})

    def action_backup(self):
        # 包裹原备份逻辑,自动处理数据的临时修改与恢复
        with self._temp_archive_custom_data():
            return super().action_backup()

方法二:数据库级备份的脚本化处理

如果是通过pg_dump直接做数据库备份,可以用SQL脚本临时修改数据,备份完成后恢复:

  1. 备份前执行SQL,保存原始状态并归档目标数据:
-- 创建临时表存储原始状态
CREATE TEMP TABLE temp_custom_data AS SELECT id, state FROM your_custom_model WHERE your_filter_condition = true;
-- 执行归档
UPDATE your_custom_model SET state = 'archived' WHERE your_filter_condition = true;
  1. 执行pg_dump命令生成备份文件:
pg_dump -d your_odoo_db -f backup.sql
  1. 备份完成后恢复原始数据:
-- 恢复状态
UPDATE your_custom_model cm
SET state = temp.state
FROM temp_custom_data temp
WHERE cm.id = temp.id;
-- 删除临时表
DROP TABLE temp_custom_data;

方法三:模拟Odoo.Sh的Cron保护机制

给自定义模型添加protected字段,标记需要保留的数据,备份时仅归档非保护数据:

  1. 给自定义模型添加保护字段:
from odoo import models, fields

class YourCustomModel(models.Model):
    _name = 'your.custom.model'
    # ... 原有字段
    protected = fields.Boolean(string="备份时保留", default=False)
  1. 在备份逻辑中,仅归档非保护记录:
# 替换到方法一的_temp_archive_custom_data方法中
target_records = custom_model.search([('protected', '=', False)])

注意事项

  • 必须确保备份完成后恢复原始数据,防止线上业务受影响
  • 数据库级操作要注意事务原子性,避免中途出错导致数据异常
  • 若使用Odoo的RPC接口触发备份,可在调用备份前后通过RPC执行数据修改与恢复操作

内容的提问来源于stack exchange,提问作者Salem Hassan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 07:52:23