定义的默认类型

    1. gorm.Model
    2. GORM 定义一个 gorm.Model 结构体,其包括字段 IDCreatedAtUpdatedAtDeletedAt
    3. // gorm.Model 的定义
    4. type Model struct {
    5. ID uint `gorm:"primaryKey"`
    6. CreatedAt time.Time
    7. UpdatedAt time.Time
    8. DeletedAt gorm.DeletedAt `gorm:"index"`
    9. }

    数据类型默认配置

    1. func (dialector Dialector) DataTypeOf(field *schema.Field) string {
    2. switch field.DataType {
    3. case schema.Bool:
    4. return "boolean"
    5. case schema.Int, schema.Uint:
    6. sqlType := "bigint"
    7. switch {
    8. case field.Size <= 8:
    9. sqlType = "tinyint"
    10. case field.Size <= 16:
    11. sqlType = "smallint"
    12. case field.Size <= 24:
    13. sqlType = "mediumint"
    14. case field.Size <= 32:
    15. sqlType = "int"
    16. }
    17. if field.DataType == schema.Uint {
    18. sqlType += " unsigned"
    19. }
    20. if field.AutoIncrement {
    21. sqlType += " AUTO_INCREMENT"
    22. }
    23. return sqlType
    24. case schema.Float:
    25. if field.Precision > 0 {
    26. return fmt.Sprintf("decimal(%d, %d)", field.Precision, field.Scale)
    27. }
    28. if field.Size <= 32 {
    29. return "float"
    30. }
    31. return "double"
    32. case schema.String:
    33. size := field.Size
    34. defaultSize := dialector.DefaultStringSize
    35. if size == 0 {
    36. if defaultSize > 0 {
    37. size = int(defaultSize)
    38. } else {
    39. hasIndex := field.TagSettings["INDEX"] != "" || field.TagSettings["UNIQUE"] != ""
    40. // TEXT, GEOMETRY or JSON column can't have a default value
    41. if field.PrimaryKey || field.HasDefaultValue || hasIndex {
    42. size = 191 // utf8mb4
    43. }
    44. }
    45. }
    46. if size >= 65536 && size <= int(math.Pow(2, 24)) {
    47. return "mediumtext"
    48. } else if size > int(math.Pow(2, 24)) || size <= 0 {
    49. return "longtext"
    50. }
    51. return fmt.Sprintf("varchar(%d)", size)
    52. case schema.Time:
    53. precision := ""
    54. if !dialector.DisableDatetimePrecision {
    55. if field.Precision == 0 {
    56. field.Precision = 3
    57. }
    58. if field.Precision > 0 {
    59. precision = fmt.Sprintf("(%d)", field.Precision)
    60. }
    61. }
    62. if field.NotNull || field.PrimaryKey {
    63. return "datetime" + precision
    64. }
    65. return "datetime" + precision + " NULL"
    66. case schema.Bytes:
    67. if field.Size > 0 && field.Size < 65536 {
    68. return fmt.Sprintf("varbinary(%d)", field.Size)
    69. }
    70. if field.Size >= 65536 && field.Size <= int(math.Pow(2, 24)) {
    71. return "mediumblob"
    72. }
    73. return "longblob"
    74. }
    75. return string(field.DataType)
    76. }
    标签名 说明
    column 指定 db 列名
    type 列数据类型,推荐使用兼容性好的通用类型,例如:所有数据库都支持 bool、int、uint、float、string、time、bytes 并且可以和其他标签一起使用,例如:not nullsize, autoIncrement… 像 varbinary(8) 这样指定数据库数据类型也是支持的。在使用指定数据库数据类型时,它需要是完整的数据库数据类型,如:MEDIUMINT UNSIGNED not NULL AUTO_INSTREMENT
    size 指定列大小,例如:size:256
    primaryKey 指定列为主键
    unique 指定列为唯一
    default 指定列的默认值
    precision 指定列的精度
    scale 指定列大小
    not null 指定列为 NOT NULL
    autoIncrement 指定列为自动增长
    embedded 嵌套字段
    embeddedPrefix 嵌入字段的列名前缀
    autoCreateTime 创建时追踪当前时间,对于 int 字段,它会追踪时间戳秒数,您可以使用 nano/milli 来追踪纳秒、毫秒时间戳,例如:autoCreateTime:nano
    autoUpdateTime 创建/更新时追踪当前时间,对于 int 字段,它会追踪时间戳秒数,您可以使用 nano/milli 来追踪纳秒、毫秒时间戳,例如:autoUpdateTime:milli
    index 根据参数创建索引,多个字段使用相同的名称则创建复合索引,查看 索引 获取详情
    uniqueIndex index 相同,但创建的是唯一索引
    check 创建检查约束,例如 check:age > 13,查看 约束 获取详情
    <- 设置字段写入的权限, <-:create 只创建、<-:update 只更新、<-:false 无写入权限、<- 创建和更新权限
    -> 设置字段读的权限,->:false 无读权限
    - 忽略该字段,- 无读写权限

    eg:

    1. type Student struct {
    2. Id uint `gorm:"size:32;primaryKey;autoIncrement;not null"`
    3. Name string `gorm:"size:20"`
    4. Gender int `gorm:"size:4"`
    5. Number string `gorm:"type:char(8);uniqueIndex:uk_num"`
    6. DepartID uint `gorm:"size:32;not null;index:idx_dep"`
    7. MajorID uint `gorm:"size:32;not null;index:idx_major"`
    8. CreatedAt time.Time
    9. UpdatedAt time.Time
    10. }

    创建的数据表

    1. CREATE TABLE `students` (
    2. `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    3. `name` varchar(20) COLLATE utf8mb4_bin DEFAULT NULL,
    4. `gender` tinyint(4) DEFAULT NULL,
    5. `number` char(8) COLLATE utf8mb4_bin DEFAULT NULL,
    6. `depart_id` int(10) unsigned NOT NULL,
    7. `major_id` int(10) unsigned NOT NULL,
    8. `created_at` datetime(3) DEFAULT NULL,
    9. `updated_at` datetime(3) DEFAULT NULL,
    10. PRIMARY KEY (`id`),
    11. UNIQUE KEY `uk_num` (`number`),
    12. KEY `idx_dep` (`depart_id`),
    13. KEY `idx_major` (`major_id`)
    14. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;