目录:
这一篇介绍模型定义, 由于我的目标是使用go重写我之前的python的django项目, 所以这一篇的模型, 主要是建立我之前用django的orm建立的模型
Python的模型
class Group(models.Model): class Meta: db_table = 'group' id = models.AutoField(primary_key=True) name = models.CharField(max_length=45) class Users(models.Model): class Meta: db_table = 'users' id = models.AutoField(primary_key=True) profile = models.CharField(max_length=45, null=False, unique=True) name = models.CharField(max_length=45, null=False) mail = models.CharField(max_length=140, null=False) group = models.ForeignKey(Group, on_delete=models.CASCADE) state = models.CharField(max_length=20) location = models.CharField(max_length=20)
Go的模型
由于在grom中, 如果不标注表名,默认是会带上s的, 所以我们可以定义一个结构体方法来自定义表名
type Group struct { ID uint `gorm:"primaryKey;autoIncrement;size:11;"` Name string `gorm:"size:45"` } type Users struct { ID uint `gorm:"primaryKey;autoIncrement;size:11;"` Profile string `gorm:"size:45;"` Name string `gorm:"size:45;"` Mail string `gorm:"size:140;"` Status string `gorm:"size:20;"` Location string `gorm:"size:20"` GroupId int `gorm:"column:group_id"` Group } func (Users) TableName() string { return "users" } func (Group) TableName() string { return "group" }
可以看到go中的模型, 是使用结构体标签来标注属性, 多个属性使用;分割
下面列出来一些常用的属性
标签名 | 说明 |
---|---|
column | 指定 db 列名 |
type | 列数据类型,推荐使用兼容性好的通用类型,例如:所有数据库都支持 bool、int、uint、float、string、time、bytes 并且可以和其他标签一起使用,例如:not null 、size , autoIncrement … 像 varbinary(8) 这样指定数据库数据类型也是支持的。在使用指定数据库数据类型时,它需要是完整的数据库数据类型,如:MEDIUMINT UNSIGNED not NULL AUTO_INCREMENT |
size | 指定列大小,例如:size:256 |
primaryKey | 指定列为主键 |
unique | 指定列为唯一 |
default | 指定列的默认值 |
precision | 指定列的精度 |
scale | 指定列大小 |
not null | 指定列为 NOT NULL |
autoIncrement | 指定列为自动增长 |
autoIncrementIncrement | 自动步长,控制连续记录之间的间隔 |
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 无读权限 |
– | 忽略该字段,- 无读写权限 |
comment | 迁移时为字段添加注释 |
还有一种禁止gorm自动带s的方法,就是在连接db的时候传入参数
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ NamingStrategy: schema.NamingStrategy{SingularTable: true}, })
发表回复