sql_mapping.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package sql_mapping
  2. import (
  3. "errors"
  4. "github.com/iancoleman/strcase"
  5. "reflect"
  6. "strings"
  7. )
  8. const (
  9. sqlMappingTagPartSeparator = ";"
  10. sqlMappingTagPartKeyValueSeparator = ":"
  11. )
  12. const (
  13. sqlMappingTagKey = "sqlmapping"
  14. sqlMappingIgnore = "-"
  15. sqlMappingColumn = "column"
  16. sqlMappingKey = "key"
  17. sqlMappingNotUpdate = "notUpdate"
  18. sqlMappingUpdateClear = "updateClear"
  19. sqlMappingNotQuery = "notQuery"
  20. sqlMappingQueryConditionCallback = "queryConditionCallback"
  21. )
  22. type SqlMapping struct {
  23. ColumnMap map[string]SqlColumn
  24. }
  25. func ParseSqlMapping(e any) (*SqlMapping, error) {
  26. if e == nil {
  27. return nil, errors.New("没有传递实体")
  28. }
  29. entityType := reflect.TypeOf(e)
  30. if entityType.Kind() == reflect.Ptr {
  31. entityType = entityType.Elem()
  32. }
  33. if entityType.Kind() != reflect.Struct {
  34. return nil, errors.New("传递的不是实体结构")
  35. }
  36. sqlMapping := new(SqlMapping)
  37. sqlMapping.ColumnMap = make(map[string]SqlColumn)
  38. fieldNum := entityType.NumField()
  39. for i := 0; i < fieldNum; i++ {
  40. sqlColumn, err := parseSqlColumn(entityType.Field(i))
  41. if err != nil {
  42. return nil, err
  43. }
  44. if sqlColumn == nil {
  45. continue
  46. }
  47. sqlMapping.ColumnMap[sqlColumn.Name] = *sqlColumn
  48. }
  49. return sqlMapping, nil
  50. }
  51. type SqlColumn struct {
  52. Name string
  53. IsKey bool
  54. CanUpdate bool
  55. CanUpdateClear bool
  56. CanQuery bool
  57. NeedQueryConditionCallback bool
  58. }
  59. func parseSqlColumn(field reflect.StructField) (*SqlColumn, error) {
  60. sqlColumn := &SqlColumn{
  61. Name: strcase.ToSnake(field.Name),
  62. IsKey: false,
  63. CanUpdate: true,
  64. CanUpdateClear: false,
  65. CanQuery: true,
  66. NeedQueryConditionCallback: false,
  67. }
  68. sqlMappingTag, ok := field.Tag.Lookup(sqlMappingTagKey)
  69. if !ok {
  70. return sqlColumn, nil
  71. }
  72. if sqlMappingTag == sqlMappingIgnore {
  73. return nil, nil
  74. }
  75. sqlMappingParts := strings.Split(sqlMappingTag, sqlMappingTagPartSeparator)
  76. if sqlMappingParts != nil || len(sqlMappingParts) != 0 {
  77. for _, sqlMappingPart := range sqlMappingParts {
  78. sqlPartKeyValue := strings.Split(strings.TrimSpace(sqlMappingPart), sqlMappingTagPartKeyValueSeparator)
  79. switch sqlPartKeyValue[0] {
  80. case sqlMappingColumn:
  81. sqlColumn.Name = strings.TrimSpace(sqlPartKeyValue[1])
  82. case sqlMappingKey:
  83. sqlColumn.IsKey = true
  84. sqlColumn.CanUpdate = false
  85. case sqlMappingNotUpdate:
  86. sqlColumn.CanUpdate = false
  87. case sqlMappingUpdateClear:
  88. sqlColumn.CanUpdateClear = true
  89. case sqlMappingNotQuery:
  90. sqlColumn.CanQuery = false
  91. case sqlMappingQueryConditionCallback:
  92. sqlColumn.NeedQueryConditionCallback = true
  93. default:
  94. continue
  95. }
  96. }
  97. }
  98. return sqlColumn, nil
  99. }