如何在创建Postgres备份时覆盖/移除指定数据(参考Odoo.Sh逻辑)
实现Odoo备份时自定义数据归档/移除的方案
方法一:继承备份向导(推荐,适配Odoo原生备份流程)
直接继承Odoo自带的base.backup临时模型,在备份执行前后插入自定义数据处理逻辑,确保线上数据不会被永久修改:
- 创建自定义模块,继承
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脚本临时修改数据,备份完成后恢复:
- 备份前执行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;
- 执行
pg_dump命令生成备份文件:
pg_dump -d your_odoo_db -f backup.sql
- 备份完成后恢复原始数据:
-- 恢复状态 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字段,标记需要保留的数据,备份时仅归档非保护数据:
- 给自定义模型添加保护字段:
from odoo import models, fields class YourCustomModel(models.Model): _name = 'your.custom.model' # ... 原有字段 protected = fields.Boolean(string="备份时保留", default=False)
- 在备份逻辑中,仅归档非保护记录:
# 替换到方法一的_temp_archive_custom_data方法中 target_records = custom_model.search([('protected', '=', False)])
注意事项
- 必须确保备份完成后恢复原始数据,防止线上业务受影响
- 数据库级操作要注意事务原子性,避免中途出错导致数据异常
- 若使用Odoo的RPC接口触发备份,可在调用备份前后通过RPC执行数据修改与恢复操作
内容的提问来源于stack exchange,提问作者Salem Hassan
相关产品推荐
相关产品推荐

