Nav apraksta
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

get_dic_table_detail.go 3.6KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package dicmanagement
  2. import (
  3. "context"
  4. "fmt"
  5. "strings"
  6. "git.x2erp.com/qdy/go-base/ctx"
  7. "git.x2erp.com/qdy/go-base/logger"
  8. "git.x2erp.com/qdy/go-base/model/response"
  9. "git.x2erp.com/qdy/go-base/util"
  10. "git.x2erp.com/qdy/go-db/factory/database"
  11. "git.x2erp.com/qdy/go-svc-configure/internal/tables"
  12. )
  13. // GetDicTableDetail 获取数据库表字典详情(主表+子表)
  14. func GetDicTableDetail(tableID string, ctx context.Context, dbFactory *database.DBFactory, reqCtx *ctx.RequestContext) *response.QueryResult[DicTableDetail] {
  15. logger.Debug(fmt.Sprintf("GetDicTableDetail-开始获取数据库表字典详情: %s", tableID))
  16. // 参数验证
  17. if tableID == "" {
  18. logger.ErrorC(reqCtx, "表ID不能为空")
  19. return util.CreateErrorResult[DicTableDetail]("表ID不能为空", reqCtx)
  20. }
  21. // 获取数据库连接
  22. db := dbFactory.GetDB()
  23. // 查询主表信息
  24. var table tables.DicTableDB
  25. query := `
  26. SELECT table_id, table_type, table_name, description, creator, created_at, updated_at, deleted_at
  27. FROM dic_table
  28. WHERE table_id = ? AND deleted_at IS NULL
  29. `
  30. err := db.GetContext(ctx, &table, query, tableID)
  31. if err != nil {
  32. errMsg := err.Error()
  33. // 检查是否是"表不存在"错误(no rows in result set)
  34. // 处理不同数据库驱动可能返回的不同错误消息
  35. lowerErrMsg := strings.ToLower(errMsg)
  36. if strings.Contains(lowerErrMsg, "no rows") ||
  37. strings.Contains(lowerErrMsg, "没有找到") ||
  38. strings.Contains(lowerErrMsg, "不存在") ||
  39. strings.Contains(lowerErrMsg, "not found") {
  40. logger.DebugC(reqCtx, fmt.Sprintf("表 %s 不存在", tableID))
  41. return util.CreateErrorResult[DicTableDetail](fmt.Sprintf("查询数据库表字典主表失败: sql: no rows in result set"), reqCtx)
  42. }
  43. // 检查是否是context取消错误
  44. if strings.Contains(errMsg, "context canceled") || strings.Contains(errMsg, "context deadline exceeded") {
  45. logger.WarnC(reqCtx, fmt.Sprintf("查询表 %s 被取消: %v", tableID, err))
  46. return util.CreateErrorResult[DicTableDetail](fmt.Sprintf("查询数据库表字典主表失败: context canceled"), reqCtx)
  47. }
  48. // 其他查询错误
  49. logger.ErrorC(reqCtx, fmt.Sprintf("查询数据库表字典主表失败: %v", err))
  50. return util.CreateErrorResult[DicTableDetail](fmt.Sprintf("查询数据库表字典主表失败: %v", err), reqCtx)
  51. }
  52. // 查询子表信息(字段列表)
  53. var fields []tables.DicTableFieldDB
  54. fieldQuery := `
  55. SELECT id, field_id, table_id, filed_type, data_type, field_name, field_name_cn, description, creator, created_at, updated_at, deleted_at
  56. FROM dic_table_field
  57. WHERE table_id = ? AND deleted_at IS NULL
  58. ORDER BY created_at
  59. `
  60. err = db.SelectContext(ctx, &fields, fieldQuery, tableID)
  61. if err != nil {
  62. errMsg := err.Error()
  63. // 检查是否是context取消错误
  64. if strings.Contains(errMsg, "context canceled") || strings.Contains(errMsg, "context deadline exceeded") {
  65. logger.WarnC(reqCtx, fmt.Sprintf("查询表 %s 字段被取消: %v", tableID, err))
  66. return util.CreateErrorResult[DicTableDetail](fmt.Sprintf("查询数据库表字段字典失败: context canceled"), reqCtx)
  67. }
  68. // 其他查询错误(SelectContext通常不会返回no rows错误)
  69. logger.ErrorC(reqCtx, fmt.Sprintf("查询数据库表字段字典失败: %v", err))
  70. return util.CreateErrorResult[DicTableDetail](fmt.Sprintf("查询数据库表字段字典失败: %v", err), reqCtx)
  71. }
  72. logger.Debug(fmt.Sprintf("获取到数据库表字典详情: %s, 包含 %d 个字段", tableID, len(fields)))
  73. // 构建返回结果
  74. detail := DicTableDetail{
  75. Table: table,
  76. Fields: fields,
  77. }
  78. return util.CreateSuccessResultData[DicTableDetail](detail, reqCtx)
  79. }