【问题标题】:gorm: define a valid foreign key for relations or implement the Valuer/Scanner interfacegorm:为关系定义一个有效的外键或实现 Valuer/Scanner 接口
【发布时间】:2022-02-17 15:57:23
【问题描述】:

我想在我的模型中添加一些外键。我所做的与添加外键的文档完全相同。 这些是模型

专辑型号:

type Album struct {
    gorm.Model
    Artists     []Artist
    Name        string
    ReleaseDate time.Time
    Genre       Genre
    Picture     string
}

艺人模特:

type Artist struct {
    gorm.Model
    Name        string
    Description string
    YearsActive string
}

体裁模型:

type Genre struct {
    gorm.Model
    Name        string
    Description string
}

跟踪模型:

type Track struct {
    gorm.Model
    Album    Album
    Name     string
    Artists  []Artist
    Playtime time.Duration
}

以及我用于创建表格的代码:

DB.Debug().AutoMigrate(&models.Genre{}, &models.Artist{}, &models.Album{}, &models.Track{})

我在这里做错了什么?我是外键概念的新手。我只想将曲目分别与他们的艺术家和专辑相关联。

【问题讨论】:

    标签: go go-gorm


    【解决方案1】:

    所以,问题是gorm不知道如何将专辑与艺术家联系起来(其他人也一样),您需要将AlbumID字段添加到Artist结构,以便gorm知道结构之间的联系是什么..

    以下是您展示的所有结构的示例:

    专辑型号:

    type Album struct {
        gorm.Model
        Artists     []Artist `gorm:"many2many:album_artists;"`
        Name        string
        ReleaseDate time.Time
        GenreID     uint
        Genre       Genre
        Picture     string
    }
    

    由于专辑和艺人是多对多的关系,你可以根据需要回溯check here

    艺人模特:

    type Artist struct {
        gorm.Model
        Name        string
        Description string
        YearsActive string
    }
    

    体裁模型:

    type Genre struct {
        gorm.Model
        Name        string
        Description string
    }
    

    跟踪模型:

    type Track struct {
        gorm.Model
        AlbumID  uint
        Album    Album
        Name     string
        Artists  []Artist  `gorm:"many2many:track_artists;"`  // you may back reference this too
        Playtime time.Duration
    }
    

    现在你可以使用这个了:

    DB.Debug().AutoMigrate(&models.Genre{}, &models.Artist{}, &models.Album{}, &models.Track{})
    

    【讨论】:

    • 非常感谢它按预期工作。我有另一个问题。我们是否有理由创建新表来保存模型之间的关系?我有很多关于数据库的知识要学习,所以这就是我问的原因。
    • 好吧,既然专辑可以有很多曲目,曲目可以有很多艺术家,你不需要专辑里面的艺术家,你可以通过曲目访问他们。
    • 谢谢。这是个好建议。
    猜你喜欢
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 2021-10-13
    • 2016-12-02
    相关资源
    最近更新 更多