gorm的学习之旅(2)

目录:

这一篇介绍模型定义, 由于我的目标是使用go重写我之前的python的django项目, 所以这一篇的模型, 主要是建立我之前用django的orm建立的模型

Python的模型

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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)
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)
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的, 所以我们可以定义一个结构体方法来自定义表名

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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"
}
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" }
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 nullsizeautoIncrement… 像 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的时候传入参数

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
NamingStrategy: schema.NamingStrategy{SingularTable: true},
})
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ NamingStrategy: schema.NamingStrategy{SingularTable: true}, })
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
		NamingStrategy: schema.NamingStrategy{SingularTable: true},
	})


评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注