type.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package schema
  2. import (
  3. "gorm.io/gorm/schema"
  4. "reflect"
  5. "time"
  6. )
  7. func dataTypeOf(field *schema.Field) string {
  8. var dataType string
  9. reflectType := field.FieldType
  10. for reflectType.Kind() == reflect.Ptr {
  11. reflectType = reflectType.Elem()
  12. }
  13. dataValue := reflect.Indirect(reflect.New(reflectType))
  14. switch dataValue.Kind() {
  15. case reflect.Bool:
  16. dataType = "boolean"
  17. case reflect.Int8, reflect.Int, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint8, reflect.Uint, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
  18. dataType = "integer"
  19. case reflect.Float32, reflect.Float64:
  20. dataType = "double"
  21. case reflect.Struct:
  22. if _, ok := dataValue.Interface().(time.Time); ok {
  23. dataType = "string"
  24. }
  25. default:
  26. dataType = "string"
  27. }
  28. return dataType
  29. }
  30. func dataFormatOf(field *schema.Field) string {
  31. var dataType string
  32. dataType = field.Tag.Get("format")
  33. if dataType != "" {
  34. return dataType
  35. }
  36. reflectType := field.FieldType
  37. for reflectType.Kind() == reflect.Ptr {
  38. reflectType = reflectType.Elem()
  39. }
  40. dataValue := reflect.Indirect(reflect.New(reflectType))
  41. switch dataValue.Kind() {
  42. case timeKind, timePtrKind:
  43. dataType = "datetime"
  44. case reflect.Bool:
  45. dataType = "boolean"
  46. case reflect.Int8, reflect.Int, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint8, reflect.Uint, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
  47. dataType = "integer"
  48. case reflect.Float32, reflect.Float64:
  49. dataType = "decimal"
  50. case reflect.Struct:
  51. if _, ok := dataValue.Interface().(time.Time); ok {
  52. dataType = "datetime"
  53. }
  54. default:
  55. dataType = "string"
  56. }
  57. return dataType
  58. }