diff --git a/server/internal/service/database_service.go b/server/internal/service/database_service.go index 89893d2..afc3271 100644 --- a/server/internal/service/database_service.go +++ b/server/internal/service/database_service.go @@ -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) } diff --git a/team-require/web/sub-tables-edit.md b/team-require/web/sub-tables-edit.md new file mode 100644 index 0000000..21fad67 --- /dev/null +++ b/team-require/web/sub-tables-edit.md @@ -0,0 +1,35 @@ +# 后端需求 - 编辑数据库时正确处理 sub_tables + +## 问题描述 + +用户点击 Action 修改数据库,进入 Map Tables 页面后: +1. 初始显示 2 个已选中的表 +2. 用户取消选中 1 个表,只保留 1 个 +3. 点击 Save Mapping 保存 +4. 再次点击 Map Tables 查看时,仍然显示 2 个表,而不是修改后的 1 个 + +## 原因 + +可能的问题: +1. 编辑时没有正确从数据库加载已保存的 sub_tables 数据 +2. Save Mapping 时没有正确更新 sub_tables(可能只是创建新的,没有删除已取消的) + +## 需求 + +### 1. 加载数据库时返回 sub_tables 数据 + +在获取数据库详情时,需要返回该数据库已保存的子表映射信息(包括 parent_table 等),以便前端正确显示已选中的表。 + +### 2. 保存时正确处理子表 + +- 新增的子表:创建新记录 +- 保留的子表:更新记录 +- 取消的子表:删除对应记录 + +或者使用更简单的方案: +- 保存时删除该数据库所有的旧 sub_tables +- 重新创建新的 sub_tables 记录 + +## 状态 + +- [ ] 后端修改待实现 diff --git a/team-require/web/table-count-update-edit.md b/team-require/web/table-count-update-edit.md new file mode 100644 index 0000000..c99edc6 --- /dev/null +++ b/team-require/web/table-count-update-edit.md @@ -0,0 +1,22 @@ +# 后端需求 - 编辑数据库时更新 table_count + +## 问题描述 + +用户点击 Action 修改数据库,从 2 个子表修改为 1 个子表并保存后,数据库列表中的 Tables 列没有更新为新的数量。 + +## 原因 + +编辑数据库并保存 sub_tables 时,后端没有更新 `table_count` 字段。 + +## 需求 + +在 UpdateDatabaseRequest 处理 `SubTables` 字段时,需要同步更新数据库记录的 `table_count` 字段为当前 sub_tables 的数量。 + +### 修改位置 + +- `server/internal/service/database_service.go` 或 handler +- 在 Update 方法中处理 SubTables 时更新 table_count + +## 状态 + +- [x] 后端修改已完成 diff --git a/team-require/web/table-count-update.md b/team-require/web/table-count-update.md new file mode 100644 index 0000000..b40370f --- /dev/null +++ b/team-require/web/table-count-update.md @@ -0,0 +1,30 @@ +# 后端需求 - 保存映射时更新 table_count + +## 问题描述 + +用户在 Database 列表页面看到 Table Mapping 选中 2 个表并保存后,表格的 Tables 列仍然显示 1,没有更新为实际选中的表数量。 + +## 原因 + +保存 Table Mapping 时,后端没有更新数据库的 `table_count` 字段。 + +## 需求 + +在保存子表映射时,需要同时更新数据库的 `table_count` 字段为实际保存的子表数量。 + +### 修改位置 + +- `server/internal/service/database_service.go` 或 handler +- 在处理 `SubTables` 保存逻辑后,更新 `database_info` 表的 `table_count` 字段 + +### 逻辑 + +```go +// 保存 sub_tables 后,更新 table_count +tableCount := len(subTables) +// 更新数据库记录的 table_count 字段 +``` + +## 状态 + +- [x] 后端修改已完成 diff --git a/team-require/web/todo-2026-3-7.md b/team-require/web/todo-2026-3-7.md index 0262cc6..69eb2b9 100644 --- a/team-require/web/todo-2026-3-7.md +++ b/team-require/web/todo-2026-3-7.md @@ -8,6 +8,18 @@ - 前端只发送 ddl 字段,不再发送 fields 字段 - 详细需求:[ddl-edit.md](./ddl-edit.md) +- [x] **保存映射时更新 table_count** - 后端已完成 ✔ + - 问题:用户保存 2 个子表后,Tables 列仍显示 1 + - 详细需求:[table-count-update.md](./table-count-update.md) + +- [x] **编辑数据库时更新 table_count** - 后端已完成 ✔ + - 问题:用户从 2 个子表修改为 1 个后,Tables 列没有更新 + - 详细需求:[table-count-update-edit.md](./table-count-update-edit.md) + +- [ ] **编辑时正确处理 sub_tables** - 后端待实现 + - 问题:取消选中 1 个表后保存,再次进入仍显示 2 个表 + - 详细需求:[sub-tables-edit.md](./sub-tables-edit.md) + --- > 需求完成后请完成者打 ✔