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

Python & Django Web应用:删除库存数据不影响报表的解决方案

解决删除库存项不影响现有关联报告的问题

针对SQLite数据库下删除库存项导致关联报告加载失败的问题,以下是几个可行的解决方案:

方案1:软删除(推荐)

不物理删除库存项,而是通过标记字段区分已删除状态:

  • 给库存表添加删除标记字段:
    ALTER TABLE inventory ADD COLUMN is_deleted BOOLEAN DEFAULT 0;
    
  • 修改应用中的删除逻辑:将原来的DELETE FROM inventory WHERE id = ?替换为更新标记的语句:
    UPDATE inventory SET is_deleted = 1 WHERE id = ?;
    
  • 日常库存查询时过滤已删除项(比如SELECT * FROM inventory WHERE is_deleted = 0),但加载历史报告时不做过滤,直接读取完整库存数据。这样旧报告依然能获取到历史库存的详情,不会报错。

方案2:给关联文档存储库存快照

在创建估价单、服务报告、发票时,把库存项的关键信息(名称、价格、规格等)同步复制到文档的关联表中,不再仅依赖库存ID:

  • 例如,原来的estimate_items表只存estimate_id和inventory_id,现在新增product_name、unit_price、sku等字段
  • 当用户选择库存项生成报告时,除了记录库存ID,还把当前库存的这些字段值写入estimate_items
  • 后续加载报告时,直接读取estimate_items里的快照数据,即使原库存项被删除,也不会影响报告展示

方案3:调整外键约束行为

如果之前的外键约束是RESTRICT或CASCADE(导致删除库存时关联数据受影响),可以修改为SET NULL或SET DEFAULT:

  1. 先查看当前外键配置:
    PRAGMA foreign_key_list(estimate_items); -- 替换为你的关联表名,比如invoice_items、service_report_items
    
  2. 由于SQLite不支持直接修改外键,需要重建关联表:
    • 备份原表数据:
      CREATE TABLE estimate_items_backup AS SELECT * FROM estimate_items;
      
    • 删除原表:
      DROP TABLE estimate_items;
      
    • 重建表并设置外键为ON DELETE SET NULL:
      CREATE TABLE estimate_items (
        id INTEGER PRIMARY KEY,
        estimate_id INTEGER,
        inventory_id INTEGER,
        FOREIGN KEY(inventory_id) REFERENCES inventory(id) ON DELETE SET NULL
      );
      
    • 恢复备份数据:
      INSERT INTO estimate_items SELECT * FROM estimate_items_backup;
      
  3. 应用层处理inventory_id为NULL的情况,加载报告时显示占位文本(比如「[已删除库存项]」),避免报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 22:55:04