这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
创建连接的参数
db, err := gorm.Open(mysql.New(mysql.Config{
DSN: "root:password@tcp(123.249.111.000:3306)/gorm_class?charset=utf8mb4&parseTime=True&loc=Local",
DefaultStringSize: 171,
}), &gorm.Config{
SkipDefaultTransaction: false,
NamingStrategy: schema.NamingStrategy{
TablePrefix: "gov_", // table name prefix, table for `User` would be `t_users`
SingularTable: true, // use singular table name, table for `User` would be `user` with this option enable
},
DisableForeignKeyConstraintWhenMigrating: true,//逻辑外键
})
gorm的标签
primaryKey 将列定义为主键
unique 列非空
default 列空时设置为默认值
embedded 设置为嵌套字段
index 设置索引
column 指定列名
embeddedPrefix 设置嵌套字段的前缀 目前只用到了这些,以后有用到其他的再进行学习
has one
结构体的定义
type GrilGod struct {
gorm.Model
Name string
Dog Dog
}
type Dog struct {
gorm.Model
Name string
GrilGodID uint
//GrilGod GrilGod
}
创建has one 关系的结构体
创建操作
if M.HasTable(&Dog{}) == false {
M.CreateTable(&Dog{})
}
if M.HasTable(&GrilGod{}) == false {
M.CreateTable(&GrilGod{})
}
tg := Dog{
Model: gorm.Model{ID: 1},
Name: "123",
}
ns := GrilGod{
Model: gorm.Model{ID: 1},
Dog: tg,
}
db.Create(&ns)
如果这样进行创建,gorm会自动帮助我们对tg这个数据进行创建,并将Gril God的ID赋值为相应的Gril God的ID
预加载的使用
ns := GrilGod{
Model: gorm.Model{ID: 1},
//Dog: tg,
}
//db.Create(&ns)
db.Preload("Dog").Find(&ns)
在使用查询的时候我们要注意预加载,如果不进行预加载,那我们没办法将对应的Dog和GrilGod一起提出来,而是空值
Belongs To
结构体定义
type GrilGod struct {
gorm.Model
Name string
//Dog Dog
}
type Dog struct {
gorm.Model
Name string
GrilGodID uint
GrilGod GrilGod
}
创建操作
if M.HasTable(&Dog{}) == false {
M.CreateTable(&Dog{})
}
if M.HasTable(&GrilGod{}) == false {
M.CreateTable(&GrilGod{})
}
ns := GrilGod{
Model: gorm.Model{ID: 1},
Name: "ss",
//Dog: tg,
}
tg := Dog{
Model: gorm.Model{ID: 1},
Name: "123",
GrilGod: ns,
}
db.Create(&tg)
当我们对tg进行创建操作的时候也会对相应的ns进行创建
对关系的操作
db.Model(&tg).Association("GrilGod").Append(&ns)
db.Model(&tg).Association("GrilGod").Clear()
db.Model(&tg).Association("GrilGod").Delete(&ns)
db.Model(&tg).Association("GrilGod").Replace(&ns,&ns1)
对关系进行清除,修改,增加等操作
gorm.Model的使用
在使用gorm.Model的时候,一定要小心,不是硬删除,而是软删除,我们可以使用Unscoped()来查询软删除的数据,或者对数据进行硬删除