【问题标题】:GORM associations .Create()GORM 关联 .Create()
【发布时间】:2019-07-25 14:09:56
【问题描述】:

我几天前开始学习 go,我正在尝试使用 go 和 gorm 构建一个 REST API 来实现数据持久性。我正在构建一个电影管理 API,并且我有一些带有质量和语言关联的 Profile。

type Profile struct {
    gorm.Model
    ThresholdQuality Quality `json:"thresholdQuality" validate:"required"`

    PreferredLanguage Language `json:"preferredLanguage" validate:"required"`
}

type Language struct {
    Language string `json:"language" gorm:"primary_key"`
}

type Quality struct {
    Quality string `json:"quality" gorm:"primary_key"`
}

以及在数据库中的创建

func InitDb(){
    var err error
    DB, err = gorm.Open("sqlite3", "gotorro.db")
    if err != nil {
        fmt.Printf("%s",err)
        panic("failed to connect database.")
    }
    DB.AutoMigrate(&Movie{})
    DB.AutoMigrate(&Quality{})
    DB.AutoMigrate(&Language{})
    DB.AutoMigrate(&Profile{})

    french := Language{Language:"french"}
    english := Language{Language:"english"}

    DB.Create(&french)
    DB.Create(&english)

    profile := Profile{
        ThresholdQuality: Quality{"1080p"},
        PreferredLanguage: Language{"french"},
    }

    DB.Create(&profile)
}

当通过 sqlite 查看我的数据库时,成功创建了语言和质量

sqlite> select * from qualities ;
1080p
720p
sqlite> select * from Languages ;
french
english

但是当我的个人资料被创建时,品质和语言仍然是空的

sqlite> select * from profiles;

12|2019-07-25 09:54:44.165365026-04:00|2019-07-25 09:54:44.165365026-04:00|||||

根据 gorm 文档,我的个人资料应该包含质量和语言的外键。

我错过了什么?

【问题讨论】:

    标签: sqlite go go-gorm


    【解决方案1】:

    在您的配置文件模型中,您需要创建将存储相关模型的外键的字段。所以你的个人资料模型应该是这样的

    type Profile struct {
        gorm.Model
        ThresholdQuality           Quality `json:"thresholdQuality" validate:"required"`
        ThresholdQualityQuality    string
        PreferredLanguage          Language `json:"preferredLanguage" validate:"required"`
        PreferredLanguageLanguage  string
    }
    

    默认情况下,gorm 使用由 Profile 模型中的 FieldName 组成的字段名称(在您的情况下,例如 TresholdQuality)和关联模型中的主键字段的名称(对于 Quality 结构是 Quality 字段)。您可以使用gorm:"foreignkey" 标签更改它,然后您的个人资料看起来像这样

    type Profile struct {
        gorm.Model
        ThresholdQuality     Quality `gorm:"foreignkey:ThresholdQualityID" json:"thresholdQuality" validate:"required"`
        ThresholdQualityID   string
        PreferredLanguage    Language `gorm:"foreignkey:PreferredLanguageID" json:"preferredLanguage" validate:"required"`
        PreferredLanguageID  string
    }
    

    【讨论】:

      猜你喜欢
      • 2015-06-08
      • 1970-01-01
      • 2020-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-07
      • 2021-10-12
      • 1970-01-01
      相关资源
      最近更新 更多