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:
- 先查看当前外键配置:
PRAGMA foreign_key_list(estimate_items); -- 替换为你的关联表名,比如invoice_items、service_report_items - 由于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;
- 备份原表数据:
- 应用层处理
inventory_id为NULL的情况,加载报告时显示占位文本(比如「[已删除库存项]」),避免报错。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

