定义的默认类型
gorm.ModelGORM 定义一个 gorm.Model 结构体,其包括字段 ID、CreatedAt、UpdatedAt、DeletedAt// gorm.Model 的定义type Model struct {ID uint `gorm:"primaryKey"`CreatedAt time.TimeUpdatedAt time.TimeDeletedAt gorm.DeletedAt `gorm:"index"`}
数据类型默认配置
func (dialector Dialector) DataTypeOf(field *schema.Field) string {switch field.DataType {case schema.Bool:return "boolean"case schema.Int, schema.Uint:sqlType := "bigint"switch {case field.Size <= 8:sqlType = "tinyint"case field.Size <= 16:sqlType = "smallint"case field.Size <= 24:sqlType = "mediumint"case field.Size <= 32:sqlType = "int"}if field.DataType == schema.Uint {sqlType += " unsigned"}if field.AutoIncrement {sqlType += " AUTO_INCREMENT"}return sqlTypecase schema.Float:if field.Precision > 0 {return fmt.Sprintf("decimal(%d, %d)", field.Precision, field.Scale)}if field.Size <= 32 {return "float"}return "double"case schema.String:size := field.SizedefaultSize := dialector.DefaultStringSizeif size == 0 {if defaultSize > 0 {size = int(defaultSize)} else {hasIndex := field.TagSettings["INDEX"] != "" || field.TagSettings["UNIQUE"] != ""// TEXT, GEOMETRY or JSON column can't have a default valueif field.PrimaryKey || field.HasDefaultValue || hasIndex {size = 191 // utf8mb4}}}if size >= 65536 && size <= int(math.Pow(2, 24)) {return "mediumtext"} else if size > int(math.Pow(2, 24)) || size <= 0 {return "longtext"}return fmt.Sprintf("varchar(%d)", size)case schema.Time:precision := ""if !dialector.DisableDatetimePrecision {if field.Precision == 0 {field.Precision = 3}if field.Precision > 0 {precision = fmt.Sprintf("(%d)", field.Precision)}}if field.NotNull || field.PrimaryKey {return "datetime" + precision}return "datetime" + precision + " NULL"case schema.Bytes:if field.Size > 0 && field.Size < 65536 {return fmt.Sprintf("varbinary(%d)", field.Size)}if field.Size >= 65536 && field.Size <= int(math.Pow(2, 24)) {return "mediumblob"}return "longblob"}return string(field.DataType)}
| 标签名 | 说明 |
|---|---|
| column | 指定 db 列名 |
| type | 列数据类型,推荐使用兼容性好的通用类型,例如:所有数据库都支持 bool、int、uint、float、string、time、bytes 并且可以和其他标签一起使用,例如:not null、size, 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:
type Student struct {Id uint `gorm:"size:32;primaryKey;autoIncrement;not null"`Name string `gorm:"size:20"`Gender int `gorm:"size:4"`Number string `gorm:"type:char(8);uniqueIndex:uk_num"`DepartID uint `gorm:"size:32;not null;index:idx_dep"`MajorID uint `gorm:"size:32;not null;index:idx_major"`CreatedAt time.TimeUpdatedAt time.Time}
创建的数据表
CREATE TABLE `students` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(20) COLLATE utf8mb4_bin DEFAULT NULL,`gender` tinyint(4) DEFAULT NULL,`number` char(8) COLLATE utf8mb4_bin DEFAULT NULL,`depart_id` int(10) unsigned NOT NULL,`major_id` int(10) unsigned NOT NULL,`created_at` datetime(3) DEFAULT NULL,`updated_at` datetime(3) DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `uk_num` (`number`),KEY `idx_dep` (`depart_id`),KEY `idx_major` (`major_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
