Golang:table 上插入或更新时的 Gorm 错误违反了外键约束
Golang: Gorm Error on insert or update on table violates foreign key contraint
我正在尝试使用 Gorm 创建 REST 服务,该服务在启动时会从我的 Postgres 数据库中删除数据库表,然后使用测试数据创建并填充它们。我使用的实体如下:
type Group struct {
ID uuid.UUID `gorm:"PrimaryKey" json:"id"`
Name string `json:"name"`
Sessions []Session `gorm:"foreignKey:ID" json:"sessions"`
}
type Session struct {
ID uuid.UUID `gorm:"PrimaryKey"`
GroupID uuid.UUID `gorm:"foreignKey:ID"`
Name string
From time.Time
To time.Time
}
type Player struct {
ID uuid.UUID `gorm:"PrimaryKey" json:"id"`
Sessions []Session `gorm:"many2many:players_sessions" json:"sessions"`
Groups []Group `gorm:"many2many:players_groups" json:"groups"`
Username string `gorm:"type:varchar;NOT NULL" json:"username"`
Cookie string `json:"cookie"`
}
在启动时,当表被删除时,它们将使用以下代码重新创建和填充:
func PopulateDB(db *gorm.DB) {
db.AutoMigrate(&entities.Group{}, &entities.Player{}, &entities.Session{})
players := []entities.Player{
{ID: uuid.New(), Username: "Player 1", Cookie: ""},
{ID: uuid.New(), Username: "Player 2", Cookie: ""},
{ID: uuid.New(), Username: "Player 3", Cookie: ""},
}
for index := range players {
db.Create(&players[index])
}
group := entities.Group{ID: uuid.New(), Name: "My Group"}
db.Create(&group)
sessions := []entities.Session{
{
ID: uuid.New(),
GroupID: group.ID,
Name: "Session 1",
From: time.Now(),
To: time.Now().Add(12 * time.Hour),
},
{
ID: uuid.New(),
GroupID: group.ID,
Name: "Session 2",
From: time.Now().Add(24 * time.Hour),
To: time.Now().Add(36 * time.Hour),
},
}
for index := range sessions {
db.Model(&group).Association("Sessions").Append(&sessions[index])
// db.Create(&sessions[index])
}
// Make player >-< groups connections
for index := range players {
db.Model(&players[index]).Association("Groups").Append(&group)
}
// Make player >-< session connections
for index := range players {
db.Model(&players[index]).Association("Sessions").Append(&sessions[0])
if index%2 == 0 {
db.Model(&players[index]).Association("Sessions").Append(&sessions[1])
}
}
}
我遇到的问题是,当插入测试数据时 returns 出现以下错误:ERROR: insert or update on table "sessions" violates foreign key constraint "fk_groups_sessions" (SQLSTATE 23503)
。这发生在 db.Model(&group).Association("Sessions").Append(&sessions[index])
.
行
我的印象是这是由于尝试插入没有有效组外键的会话引起的,但我对 Gorm 的了解不够了解我做错了什么。任何帮助将不胜感激!
type Group struct {
ID uuid.UUID `gorm:"PrimaryKey" json:"id"`
Name string `json:"name"`
Sessions []Session `gorm:"foreignKey:GroupID" json:"sessions"
}
type Session struct {
ID uuid.UUID `gorm:"PrimaryKey"`
GroupID uuid.UUID `gorm:"foreignKey:ID"`
Name string
From time.Time
To time.Time
}
这应该可以解决问题,引用已从 ID 更改为 GroupID
如果这是你的数据库架构设计,应该是这样的。
type Group struct {
ID uuid.UUID `gorm:"primaryKey"`
Name string `gorm:"column:name"`
}
type Session struct {
ID uuid.UUID `gorm:"primaryKey"`
GroupID uuid.UUID `gorm:"column:group_id"
Group Group `gorm:"foreignKey:ID"`
Name string `gorm:"column:name"`
From time.Time `gorm:"column:from"`
To time.Time `gorm:"column:to"`
}
type Player struct {
ID uuid.UUID `gorm:"primaryKey"`
Username string `gorm:"column:username;type:varchar;NOT NULL"`
Cookie string `gorm:"column:cookie"`
SessionID uuid.UUID `gorm:"column:session_id"`
GroupID uuid.UUID `gorm:"column:group_id"`
Sessions []Session `gorm:"many2many:players_sessions;foreignKey:SessionID;references:ID;"`
Groups []Group `gorm:"many2many:players_groups;foreignKey:GroupID;references:ID;"`
}
我正在尝试使用 Gorm 创建 REST 服务,该服务在启动时会从我的 Postgres 数据库中删除数据库表,然后使用测试数据创建并填充它们。我使用的实体如下:
type Group struct {
ID uuid.UUID `gorm:"PrimaryKey" json:"id"`
Name string `json:"name"`
Sessions []Session `gorm:"foreignKey:ID" json:"sessions"`
}
type Session struct {
ID uuid.UUID `gorm:"PrimaryKey"`
GroupID uuid.UUID `gorm:"foreignKey:ID"`
Name string
From time.Time
To time.Time
}
type Player struct {
ID uuid.UUID `gorm:"PrimaryKey" json:"id"`
Sessions []Session `gorm:"many2many:players_sessions" json:"sessions"`
Groups []Group `gorm:"many2many:players_groups" json:"groups"`
Username string `gorm:"type:varchar;NOT NULL" json:"username"`
Cookie string `json:"cookie"`
}
在启动时,当表被删除时,它们将使用以下代码重新创建和填充:
func PopulateDB(db *gorm.DB) {
db.AutoMigrate(&entities.Group{}, &entities.Player{}, &entities.Session{})
players := []entities.Player{
{ID: uuid.New(), Username: "Player 1", Cookie: ""},
{ID: uuid.New(), Username: "Player 2", Cookie: ""},
{ID: uuid.New(), Username: "Player 3", Cookie: ""},
}
for index := range players {
db.Create(&players[index])
}
group := entities.Group{ID: uuid.New(), Name: "My Group"}
db.Create(&group)
sessions := []entities.Session{
{
ID: uuid.New(),
GroupID: group.ID,
Name: "Session 1",
From: time.Now(),
To: time.Now().Add(12 * time.Hour),
},
{
ID: uuid.New(),
GroupID: group.ID,
Name: "Session 2",
From: time.Now().Add(24 * time.Hour),
To: time.Now().Add(36 * time.Hour),
},
}
for index := range sessions {
db.Model(&group).Association("Sessions").Append(&sessions[index])
// db.Create(&sessions[index])
}
// Make player >-< groups connections
for index := range players {
db.Model(&players[index]).Association("Groups").Append(&group)
}
// Make player >-< session connections
for index := range players {
db.Model(&players[index]).Association("Sessions").Append(&sessions[0])
if index%2 == 0 {
db.Model(&players[index]).Association("Sessions").Append(&sessions[1])
}
}
}
我遇到的问题是,当插入测试数据时 returns 出现以下错误:ERROR: insert or update on table "sessions" violates foreign key constraint "fk_groups_sessions" (SQLSTATE 23503)
。这发生在 db.Model(&group).Association("Sessions").Append(&sessions[index])
.
我的印象是这是由于尝试插入没有有效组外键的会话引起的,但我对 Gorm 的了解不够了解我做错了什么。任何帮助将不胜感激!
type Group struct {
ID uuid.UUID `gorm:"PrimaryKey" json:"id"`
Name string `json:"name"`
Sessions []Session `gorm:"foreignKey:GroupID" json:"sessions"
}
type Session struct {
ID uuid.UUID `gorm:"PrimaryKey"`
GroupID uuid.UUID `gorm:"foreignKey:ID"`
Name string
From time.Time
To time.Time
}
这应该可以解决问题,引用已从 ID 更改为 GroupID
如果这是你的数据库架构设计,应该是这样的。
type Group struct {
ID uuid.UUID `gorm:"primaryKey"`
Name string `gorm:"column:name"`
}
type Session struct {
ID uuid.UUID `gorm:"primaryKey"`
GroupID uuid.UUID `gorm:"column:group_id"
Group Group `gorm:"foreignKey:ID"`
Name string `gorm:"column:name"`
From time.Time `gorm:"column:from"`
To time.Time `gorm:"column:to"`
}
type Player struct {
ID uuid.UUID `gorm:"primaryKey"`
Username string `gorm:"column:username;type:varchar;NOT NULL"`
Cookie string `gorm:"column:cookie"`
SessionID uuid.UUID `gorm:"column:session_id"`
GroupID uuid.UUID `gorm:"column:group_id"`
Sessions []Session `gorm:"many2many:players_sessions;foreignKey:SessionID;references:ID;"`
Groups []Group `gorm:"many2many:players_groups;foreignKey:GroupID;references:ID;"`
}