one-to-one relationship
There are relatively few one-to-one relationships. They are generally used for table extensions. For example, if a user table has many fields, it can be split into two tables. Commonly used fields are placed in the main table, and uncommon fields are placed in the details table.
For the user table, you can click userinfo through user.
Create table and insert data
package main
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
type Teacher struct {
ID int
Name string
Age int
Gender bool
TeacherInfo TeacherInfo
}
type TeacherInfo struct {
ID int
TeacherID int
Address string
Hobby string
}
func (*Teacher) TableName() string {
return "teacher"
}
func (*TeacherInfo) TableName() string {
return "teacherinfo"
}
func main() {
dsn := "root:7PXjAkY!&nlR@tcp(192.168.11.128:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})
db.Debug().AutoMigrate(&Teacher{}, &TeacherInfo{})
var teacherList []Teacher
teacherList = append(teacherList, Teacher{
Name: "yanzi",
Age: 28,
Gender: false,
TeacherInfo: TeacherInfo{
Address: "hangzhou",
Hobby: "video",
},
}, Teacher{
Name: "lucas",
Age: 30,
Gender: false,
TeacherInfo: TeacherInfo{
Address: "hangzhou",
Hobby: "reading",
},
})
db.Create(&teacherList)
}
mysql> desc teacher;
+--------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+------------+------+-----+---------+----------------+
| id | bigint | NO | PRI | NULL | auto_increment |
| name | longtext | YES | | NULL | |
| age | bigint | YES | | NULL | |
| gender | tinyint(1) | YES | | NULL | |
+--------+------------+------+-----+---------+----------------+
mysql> desc teacherinfo;
+------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+----------+------+-----+---------+----------------+
| id | bigint | NO | PRI | NULL | auto_increment |
| teacher_id | bigint | YES | MUL | NULL | |
| address | longtext | YES | | NULL | |
| hobby | longtext | YES | | NULL | |
+------------+----------+------+-----+---------+----------------+
mysql> select * from teacher;
+----+-------+------+--------+
| id | name | age | gender |
+----+-------+------+--------+
| 1 | yanzi | 28 | 0 |
| 2 | lucas | 30 | 0 |
+----+-------+------+--------+
mysql> select * from teacherinfo;
+----+------------+----------+---------+
| id | teacher_id | address | hobby |
+----+------------+----------+---------+
| 1 | 1 | hangzhou | video |
| 2 | 2 | hangzhou | reading |
+----+------------+----------+---------+
You cannot query teacherinfo information by simply using take find.
var t Teacher
db.Take(&t)
fmt.Println(t)
[4.938ms] [rows:-] SELECT count(*) FROM INFORMATION_SCHEMA.table_constraints WHERE constraint_schema = 'test' AND table_name = 'teacherinfo' AND co
nstraint_name = 'fk_teacher_teacher_info'
{1 yanzi 28 false {0 0 }}
If you want to query user details, use preload
var t Teacher
db.Debug().Preload("TeacherInfo").Take(&t)
fmt.Println(t)
[1.226ms] [rows:1] SELECT * FROM `teacherinfo` WHERE `teacherinfo`.`teacher_id` = 1
[41.415ms] [rows:1] SELECT * FROM `teacher` LIMIT 1
{1 yanzi 28 false {1 1 hangzhou video}}
delete
var t Teacher
db.Take(&t, 2)
db.Debug().Select("TeacherInfo").Delete(&t)
[3.472ms] [rows:1] DELETE FROM `teacherinfo` WHERE `teacherinfo`.`teacher_id` = 2
[60.613ms] [rows:1] DELETE FROM `teacher` WHERE `teacher`.`id` = 2