crud.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. package sdk
  2. import (
  3. "errors"
  4. "git.sxidc.com/go-tools/utils/strutils"
  5. "git.sxidc.com/service-supports/ds-sdk/sdk/raw_sql_tpl"
  6. "git.sxidc.com/service-supports/ds-sdk/sdk/tag"
  7. "reflect"
  8. "strconv"
  9. "time"
  10. )
  11. type RawSqlExecutor interface {
  12. ExecuteRawSql(sql string, executeParams map[string]any) ([]map[string]any, error)
  13. }
  14. const (
  15. timeWriteFormat = time.DateTime + ".000000 +08:00"
  16. createdTimeFieldName = "CreatedTime"
  17. lastUpdatedTimeFieldName = "LastUpdatedTime"
  18. )
  19. type InsertCallback[T any] func(e T, fieldName string, value any) (retValue any, err error)
  20. func Insert[T any](executor RawSqlExecutor, tableName string, e T, callback InsertCallback[T]) error {
  21. if executor == nil {
  22. return errors.New("没有传递执行器")
  23. }
  24. if strutils.IsStringEmpty(tableName) {
  25. return errors.New("没有传递表名")
  26. }
  27. if reflect.TypeOf(e) == nil {
  28. return errors.New("没有传递实体")
  29. }
  30. sqlMapping, err := tag.ParseSqlMapping(e)
  31. if err != nil {
  32. return err
  33. }
  34. executeParams := raw_sql_tpl.InsertExecuteParams{
  35. TableName: tableName,
  36. }
  37. now := time.Now()
  38. for fieldName, sqlMappingColumn := range sqlMapping.ColumnMap {
  39. fieldType := sqlMappingColumn.ValueFieldType
  40. value := reflect.Zero(fieldType).Interface()
  41. if !sqlMappingColumn.ValueFieldValue.IsZero() {
  42. value = sqlMappingColumn.ValueFieldValue.Interface()
  43. }
  44. if sqlMappingColumn.InsertCallback {
  45. if callback == nil {
  46. return errors.New("需要使用回调函数但是没有传递回调函数")
  47. }
  48. retValue, err := callback(e, fieldName, value)
  49. if err != nil {
  50. return err
  51. }
  52. retValueType := reflect.TypeOf(retValue)
  53. if retValueType == nil || retValueType.Kind() == reflect.Ptr {
  54. return errors.New("返回应当为值类型")
  55. }
  56. value = retValue
  57. }
  58. if (fieldName == createdTimeFieldName || fieldName == lastUpdatedTimeFieldName) &&
  59. fieldType.String() == "time.Time" && value.(time.Time).IsZero() {
  60. value = now
  61. }
  62. tableRowValue, err := parseValue(value)
  63. if err != nil {
  64. return err
  65. }
  66. executeParams.TableRows = append(executeParams.TableRows, raw_sql_tpl.TableRow{
  67. Column: sqlMappingColumn.Name,
  68. Value: tableRowValue,
  69. })
  70. }
  71. executeParamsMap, err := executeParams.Map()
  72. if err != nil {
  73. return err
  74. }
  75. _, err = executor.ExecuteRawSql(raw_sql_tpl.InsertTpl, executeParamsMap)
  76. if err != nil {
  77. return err
  78. }
  79. return nil
  80. }
  81. func Delete[T any](executor RawSqlExecutor, tableName string, e T) error {
  82. if executor == nil {
  83. return errors.New("没有传递执行器")
  84. }
  85. if strutils.IsStringEmpty(tableName) {
  86. return errors.New("没有传递表名")
  87. }
  88. if reflect.TypeOf(e) == nil {
  89. return errors.New("没有传递实体")
  90. }
  91. sqlMapping, err := tag.ParseSqlMapping(e)
  92. if err != nil {
  93. return err
  94. }
  95. executeParams := raw_sql_tpl.DeleteExecuteParams{
  96. TableName: tableName,
  97. }
  98. for _, sqlMappingColumn := range sqlMapping.ColumnMap {
  99. if !sqlMappingColumn.IsKey {
  100. continue
  101. }
  102. fieldType := sqlMappingColumn.ValueFieldType
  103. value := reflect.Zero(fieldType).Interface()
  104. if !sqlMappingColumn.ValueFieldValue.IsZero() {
  105. value = sqlMappingColumn.ValueFieldValue.Interface()
  106. }
  107. tableRowValue, err := parseValue(value)
  108. if err != nil {
  109. return err
  110. }
  111. executeParams.Conditions = append(executeParams.Conditions, raw_sql_tpl.Condition{
  112. Column: sqlMappingColumn.Name,
  113. Operator: "=",
  114. Value: tableRowValue,
  115. })
  116. }
  117. executeParamsMap, err := executeParams.Map()
  118. if err != nil {
  119. return err
  120. }
  121. _, err = executor.ExecuteRawSql(raw_sql_tpl.DeleteTpl, executeParamsMap)
  122. if err != nil {
  123. return err
  124. }
  125. return nil
  126. }
  127. func parseValue(value any) (string, error) {
  128. switch v := value.(type) {
  129. case string:
  130. return "'" + v + "'", nil
  131. case bool:
  132. return strconv.FormatBool(v), nil
  133. case time.Time:
  134. return "'" + v.Format(timeWriteFormat) + "'", nil
  135. case int:
  136. return strconv.Itoa(v), nil
  137. case int8:
  138. return strconv.FormatInt(int64(v), 10), nil
  139. case int16:
  140. return strconv.FormatInt(int64(v), 10), nil
  141. case int32:
  142. return strconv.FormatInt(int64(v), 10), nil
  143. case int64:
  144. return strconv.FormatInt(v, 10), nil
  145. case uint:
  146. return strconv.FormatUint(uint64(v), 10), nil
  147. case uint8:
  148. return strconv.FormatUint(uint64(v), 10), nil
  149. case uint16:
  150. return strconv.FormatUint(uint64(v), 10), nil
  151. case uint32:
  152. return strconv.FormatUint(uint64(v), 10), nil
  153. case uint64:
  154. return strconv.FormatUint(v, 10), nil
  155. default:
  156. return "", errors.New("不支持的类型")
  157. }
  158. }