Your Question
a two-way relation makes dirty data when inserting one model
how to reproduce:
open any db, use auto migrate to migrate tables
type Meeting struct {
MeetingId int `gorm:"primaryKey"`
MeetingNo string `gorm:"unique;not null"`
BookedBy int `gorm:"not null"`
BookedByName string `gorm:"size:64;not null" comment:"who has booked this meeting"`
MeetingState string `gorm:"size:4;not null"`
ScheduledAt time.Time `gorm:"not null"`
EndedAt time.Time `gorm:"not null"`
Users []User `gorm:"many2many:user_meeting_rule"`
}
type User struct {
UserId int `gorm:"primaryKey"`
Username string `gorm:"unique;not null"`
Password string `gorm:"not null"`
Phone string `gorm:"unique;not null"`
Email string `gorm:"unique;not null"`
CreatedAt time.Time `gorm:"not null"`
Meetings []Meeting `gorm:"many2many:user_meeting_rule"`
}
if i try to insert a meeting with users, gorm will first insert user in any ways
logs:
2025/07/03 11:54:57 C:/Users/matebook/Codes/rendezvous/internal/store/dbstore/meeting.go:39
[4.056ms] [rows:0] INSERT INTO "users" ("username","password","phone","email","created_at","user_id") VALUES ('ethan','1','2','1','2025-01-01 00:00:00',1) ON CONFLICT DO NOTHING RETURNING "user_id"
2025/07/03 11:54:57 C:/Users/matebook/Codes/rendezvous/internal/store/dbstore/meeting.go:39
[5.595ms] [rows:1] INSERT INTO "user_meeting_rule" ("meeting_meeting_id","user_user_id") VALUES (1,1) ON CONFLICT DO NOTHING
2025/07/03 11:54:57 C:/Users/matebook/Codes/rendezvous/internal/store/dbstore/meeting.go:39
[58.662ms] [rows:1] INSERT INTO "meetings" ("meeting_no","booked_by","booked_by_name","meeting_state","scheduled_at","ended_at") VALUES ('6VYkJ92S',1,'ethan','1','2006-01-02 15:04:05','2006-01-03 15:04:05') RETURNING "meeting_id"
{"time":"2025-07-03T11:54:57.3330097+08:00","id":"","remote_ip":"127.0.0.1","host":"127.0.0.1:8080","method":"POST","uri":"/api/v1/meeting","user_agent":"PostmanRuntime/7.44.1","status":200,"error":"","latency":68229100,"latency_human":"68.2291ms","bytes_in":123,"bytes_out":32}
What is expected?
it should only insert middle table, not inserting user