一对一关系建表
package main
import (
"gorm.io/gorm"
"log"
)
import "gorm.io/driver/mysql"
type Student struct {
gorm.Model
Name string `gorm:"size:50;unique"` // 确保 Name 是唯一的
Sex string `gorm:"type:ENUM('男', '女');default:'男'"`
Password string
StudentDetail *StudentDetail `gorm:"foreignKey:StudentID;references:ID"` // 显式指定外键和关联字段
}
type StudentDetail struct {
ID int `gorm:"primarykey"`
Email string
StudentID int
Student *Student `gorm:"foreignKey:StudentID;references:ID"`
}
func main() {
dsn := mysql.Open("root:123456@tcp(127.0.0.1:3306)/mybatis_learn?charset=utf8&parseTime=True&loc=Local")
db, err := gorm.Open(dsn, &gorm.Config{})
if err != nil {
log.Println(err)
return
}
db.Debug().AutoMigrate(&Student{})
db.Debug().AutoMigrate(&StudentDetail{})
}
插入student信息时,顺便填充student_detail
package main
import (
"fmt"
"gorm.io/gorm"
"log"
)
import "gorm.io/driver/mysql"
type Student struct {
gorm.Model
Name string `gorm:"size:50;unique"` // 确保 Name 是唯一的
Sex string `gorm:"type:ENUM('男', '女');default:'男'"`
Password string
StudentDetail *StudentDetail `gorm:"foreignKey:StudentID;references:ID"` // 显式指定外键和关联字段
}
type StudentDetail struct {
ID int `gorm:"primarykey"`
Email string
StudentID int
Student *Student `gorm:"foreignKey:StudentID;references:ID"`
}
func main() {
dsn := mysql.Open("root:123456@tcp(127.0.0.1:3306)/mybatis_learn?charset=utf8&parseTime=True&loc=Local")
db, err := gorm.Open(dsn, &gorm.Config{})
if err != nil {
log.Println(err)
return
}
db.Create(&Student{
Name: "meowrain",
Sex: "男",
Password: "123456",
StudentDetail: &StudentDetail{
Email: "meowrain@gmail.com",
StudentID: 1,
},
})
students := []Student{}
db.Preload("StudentDetail").Find(&students)
fmt.Println(students[0].StudentDetail)
}
创建用户详情,关联用户
package main
import (
"gorm.io/gorm"
"log"
)
import "gorm.io/driver/mysql"
type Student struct {
gorm.Model
Name string `gorm:"size:50;unique"` // 确保 Name 是唯一的
Sex string `gorm:"type:ENUM('男', '女');default:'男'"`
Password string
StudentDetail *StudentDetail `gorm:"foreignKey:StudentID;references:ID"` // 显式指定外键和关联字段
}
type StudentDetail struct {
ID int `gorm:"primarykey"`
Email string
StudentID int
Student *Student `gorm:"foreignKey:StudentID;references:ID"`
}
func main() {
dsn := mysql.Open("root:123456@tcp(127.0.0.1:3306)/mybatis_learn?charset=utf8&parseTime=True&loc=Local")
db, err := gorm.Open(dsn, &gorm.Config{})
if err != nil {
log.Println(err)
return
}
err = db.Create(&Student{
Name: "jafdsfasfsdfadfadfdfas",
Sex: "男",
Password: "123456",
}).Error
if err != nil {
log.Println(err)
}
err = db.Create(&StudentDetail{
Email: "meowrain@gdsfsdfdsmail.com", StudentID: 13}).Error
if err != nil {
log.Println(err)
}
}
删除
package main
import (
"gorm.io/gorm"
"log"
)
import "gorm.io/driver/mysql"
type Student struct {
gorm.Model
Name string `gorm:"size:50;unique"` // 确保 Name 是唯一的
Sex string `gorm:"type:ENUM('男', '女');default:'男'"`
Password string
StudentDetail *StudentDetail `gorm:"foreignKey:StudentID;references:ID;constraint:OnDelete:CASCADE"` // 显式指定外键和关联字段,级联删除
}
type StudentDetail struct {
ID int `gorm:"primarykey"`
Email string
StudentID int
Student *Student `gorm:"foreignKey:StudentID;references:ID"`
}
func main() {
dsn := mysql.Open("root:123456@tcp(127.0.0.1:3306)/mybatis_learn?charset=utf8&parseTime=True&loc=Local")
db, err := gorm.Open(dsn, &gorm.Config{})
if err != nil {
log.Println(err)
return
}
// 级联删除
var student Student
db.Take(&student, 13)
db.Unscoped().Delete(&student)
}
这种情况下,我们使用直接删除是删除不掉的
我们加上select
package main
import (
"gorm.io/gorm"
"log"
)
import "gorm.io/driver/mysql"
type Student struct {
gorm.Model
Name string `gorm:"size:50;unique"` // 确保 Name 是唯一的
Sex string `gorm:"type:ENUM('男', '女');default:'男'"`
Password string
StudentDetail *StudentDetail `gorm:"foreignKey:StudentID;references:ID;constraint:OnDelete:CASCADE"` // 显式指定外键和关联字段,级联删除
}
type StudentDetail struct {
ID int `gorm:"primarykey"`
Email string
StudentID int
Student *Student `gorm:"foreignKey:StudentID;references:ID"`
}
func main() {
dsn := mysql.Open("root:123456@tcp(127.0.0.1:3306)/mybatis_learn?charset=utf8&parseTime=True&loc=Local")
db, err := gorm.Open(dsn, &gorm.Config{})
if err != nil {
log.Println(err)
return
}
// 级联删除
var student Student
db.Take(&student, 13)
db.Unscoped().Select("StudentDetail").Delete(&student)
}
就能看到执行了语句,再看数据库
可以看到数据已经被从数据库里面删除了