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;"`
}