feat: 更新数据库时支持同步保存子表配置和DDL

- UpdateDatabaseRequest 添加 SubTables 字段
- 数据库更新时同步创建或更新子表记录
- 支持子表 DDL 的保存

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-07 10:33:30 +08:00
parent c917d6b04c
commit 2eddc53249
4 changed files with 75 additions and 15 deletions

View File

@@ -696,12 +696,66 @@ func (s *DatabaseService) Update(id string, req model.UpdateDatabaseRequest) (*m
updates["ssl_mode"] = req.SSLMode
}
// 更新数据库基本信息
info := &model.DatabaseInfo{}
if err := s.repo.Update(id, info); err != nil {
log.Printf("[Update] 更新失败: %v", err)
return nil, err
}
// 处理 SubTables - 创建或更新子表记录(包括 DDL
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 {
// 存在则更新
log.Printf("[Update] 更新子表: %s", existing.ID)
err := s.subTableRepo.Update(existing.ID, &model.SubTableInfo{
ParentTable: subTableReq.ParentTable,
SubTableName: subTableReq.SubTableName,
SubTableComment: subTableReq.SubTableComment,
MappingType: subTableReq.MappingType,
RelationField: subTableReq.RelationField,
RelationType: subTableReq.RelationType,
DDL: subTableReq.DDL,
})
if err != nil {
log.Printf("[Update] 更新子表失败: %v", err)
}
found = true
break
}
}
if !found {
// 不存在则创建
log.Printf("[Update] 创建子表: %s", subTableReq.ParentTable)
err := s.subTableRepo.Create(&model.SubTableInfo{
ID: uuid.New().String(),
DatabaseID: id,
ParentTable: subTableReq.ParentTable,
SubTableName: subTableReq.SubTableName,
SubTableComment: subTableReq.SubTableComment,
MappingType: subTableReq.MappingType,
RelationField: subTableReq.RelationField,
RelationType: subTableReq.RelationType,
DDL: subTableReq.DDL,
})
if err != nil {
log.Printf("[Update] 创建子表失败: %v", err)
}
}
}
}
return s.repo.FindByID(id)
}