cascadeDeleteFileData 级联删除文件相关数据
(eid int64, fileID int64)
| 1091 | |
| 1092 | // cascadeDeleteFileData 级联删除文件相关数据 |
| 1093 | func cascadeDeleteFileData(eid int64, fileID int64) error { |
| 1094 | var sandboxOutputKey string |
| 1095 | var sandboxOutputFileID int64 |
| 1096 | file, err := GetFileByID(eid, fileID) |
| 1097 | if err == nil && file != nil && file.OriginType == FileOriginTypeAIGenerated && file.OriginRefID > 0 { |
| 1098 | sandboxOutputFileID = file.OriginRefID |
| 1099 | if outputFile, outputErr := GetAIUploadFileByID(file.OriginRefID); outputErr == nil && outputFile != nil { |
| 1100 | sandboxOutputKey = outputFile.Key |
| 1101 | } |
| 1102 | } |
| 1103 | |
| 1104 | // 在删除数据之前,先收集需要清理的向量ID |
| 1105 | vectorIDs, err := getVectorIDsForFile(eid, fileID) |
| 1106 | if err != nil { |
| 1107 | log.Printf("获取文件向量ID失败,将跳过向量清理 - EID: %d, FileID: %d, Error: %v", eid, fileID, err) |
| 1108 | vectorIDs = []string{} // 设置为空数组,避免后续处理出错 |
| 1109 | } |
| 1110 | |
| 1111 | // 开启数据库事务 |
| 1112 | tx := DB.Begin() |
| 1113 | defer func() { |
| 1114 | if r := recover(); r != nil { |
| 1115 | tx.Rollback() |
| 1116 | } |
| 1117 | }() |
| 1118 | |
| 1119 | // 按依赖关系顺序删除:关联关系 -> 检索块 -> 文档分块 -> 其他数据 -> 文件 |
| 1120 | |
| 1121 | var entityIDs []int64 |
| 1122 | if err := tx.Model(&EntityChunkRelation{}). |
| 1123 | Distinct("entity_id"). |
| 1124 | Where("eid = ? AND file_id = ?", eid, fileID). |
| 1125 | Pluck("entity_id", &entityIDs).Error; err != nil { |
| 1126 | tx.Rollback() |
| 1127 | return fmt.Errorf("查询实体关联失败: %v", err) |
| 1128 | } |
| 1129 | |
| 1130 | if err := tx.Where("eid = ? AND file_id = ?", eid, fileID).Delete(&EntityChunkRelation{}).Error; err != nil { |
| 1131 | tx.Rollback() |
| 1132 | return fmt.Errorf("删除实体关联失败: %v", err) |
| 1133 | } |
| 1134 | |
| 1135 | // 1. 删除分块关联关系 |
| 1136 | if err := tx.Where("eid = ? AND file_id = ?", eid, fileID).Delete(&ChunkRelation{}).Error; err != nil { |
| 1137 | tx.Rollback() |
| 1138 | return fmt.Errorf("删除分块关联关系失败: %v", err) |
| 1139 | } |
| 1140 | |
| 1141 | // 2. 删除检索块 |
| 1142 | if err := tx.Where("eid = ? AND file_id = ?", eid, fileID).Delete(&RetrievalChunk{}).Error; err != nil { |
| 1143 | tx.Rollback() |
| 1144 | return fmt.Errorf("删除检索块失败: %v", err) |
| 1145 | } |
| 1146 | |
| 1147 | // 3. 删除文档分块 |
| 1148 | if err := tx.Where("eid = ? AND file_id = ?", eid, fileID).Delete(&DocumentChunk{}).Error; err != nil { |
| 1149 | tx.Rollback() |
| 1150 | return fmt.Errorf("删除文档分块失败: %v", err) |
no test coverage detected