feat: 完善子表删除逻辑和table_count同步更新
- 数据库更新时自动删除不在新列表中的子表 - 同步更新 table_count 为当前子表数量 - 删除数据库时级联删除关联的子表记录 - 添加相关需求文档 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -704,16 +704,17 @@ func (s *DatabaseService) Update(id string, req model.UpdateDatabaseRequest) (*m
|
||||
}
|
||||
|
||||
// 处理 SubTables - 创建或更新子表记录(包括 DDL)
|
||||
// 先查询当前已有的子表
|
||||
existingTables, err := s.subTableRepo.FindByDatabaseID(id)
|
||||
if err != nil {
|
||||
log.Printf("[Update] 查询子表失败: %v", err)
|
||||
}
|
||||
|
||||
if len(req.SubTables) > 0 {
|
||||
log.Printf("[Update] 处理 %d 个子表配置", len(req.SubTables))
|
||||
for _, subTableReq := range req.SubTables {
|
||||
subTableReq.DatabaseID = id
|
||||
// 检查是否已存在(根据 parent_table 查找)
|
||||
existingTables, err := s.subTableRepo.FindByDatabaseID(id)
|
||||
if err != nil {
|
||||
log.Printf("[Update] 查询子表失败: %v", err)
|
||||
continue
|
||||
}
|
||||
found := false
|
||||
for _, existing := range existingTables {
|
||||
if existing.ParentTable == subTableReq.ParentTable {
|
||||
@@ -756,6 +757,42 @@ func (s *DatabaseService) Update(id string, req model.UpdateDatabaseRequest) (*m
|
||||
}
|
||||
}
|
||||
|
||||
// 删除不在新列表中的子表(无论 req.SubTables 是否为空都执行)
|
||||
if existingTables != nil && len(existingTables) > 0 {
|
||||
// 重新查询最新的子表列表
|
||||
allSubTables, err := s.subTableRepo.FindByDatabaseID(id)
|
||||
if err != nil {
|
||||
log.Printf("[Update] 查询子表失败: %v", err)
|
||||
} else {
|
||||
// 构建新请求中的 parent_table 集合
|
||||
newParentTables := make(map[string]bool)
|
||||
for _, st := range req.SubTables {
|
||||
newParentTables[st.ParentTable] = true
|
||||
}
|
||||
// 删除不存在的子表
|
||||
for _, existing := range allSubTables {
|
||||
if !newParentTables[existing.ParentTable] {
|
||||
log.Printf("[Update] 删除子表: %s (不在新列表中)", existing.ID)
|
||||
if err := s.subTableRepo.Delete(existing.ID); err != nil {
|
||||
log.Printf("[Update] 删除子表失败: %v", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 始终更新 table_count 为当前子表数量
|
||||
allSubTables, err := s.subTableRepo.FindByDatabaseID(id)
|
||||
if err != nil {
|
||||
log.Printf("[Update] 查询子表数量失败: %v", err)
|
||||
} else {
|
||||
tableCount := len(allSubTables)
|
||||
log.Printf("[Update] 更新 table_count 为: %d", tableCount)
|
||||
if err := s.repo.UpdateFields(id, map[string]interface{}{"table_count": tableCount}); err != nil {
|
||||
log.Printf("[Update] 更新 table_count 失败: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
return s.repo.FindByID(id)
|
||||
}
|
||||
|
||||
@@ -922,5 +959,12 @@ func (s *DatabaseService) Delete(id string) error {
|
||||
log.Printf("[Delete] 不存在: %v", err)
|
||||
return ErrDatabaseNotFound
|
||||
}
|
||||
|
||||
// 先删除关联的子表记录
|
||||
if err := s.subTableRepo.DeleteByDatabaseID(id); err != nil {
|
||||
log.Printf("[Delete] 删除子表失败: %v", err)
|
||||
// 继续尝试删除主表
|
||||
}
|
||||
|
||||
return s.repo.Delete(id)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user