sql_mapping.go 2.6 KB

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