sqlite - GORM 关联 .Create()
问题描述
几天前我开始学习 go,我正在尝试使用 go 和 gorm 构建一个 REST API 来实现数据持久性。我正在构建一个电影管理 API,并且我有一些带有质量和语言关联的配置文件。
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 文档,我的个人资料应该包含质量和语言的外键。
我在那里想念什么?
解决方案
在您的配置文件模型中,您需要创建将存储相关模型的外键的字段。所以你的个人资料模型应该看起来像
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
}
推荐阅读
- c# - 序列化和反序列化不适用于字典作为支持字段
- kubernetes - Kubernetes 更改挂载卷的权限
- algorithm - 该算法的复杂度如何为 O(n^2)?
- pandas - 根据时间戳删除几乎重复的行
- python - 如何解决 spyder 中 pyttsx3 模块的问题?
- javascript - 如何将事件监听器添加到 redux 表单
- asp.net-core - 如何查看 EntityFramework Core 生成的 SQL?
- wordpress - 如何检查“在档案中启用 AJAX 添加到购物车按钮”状态?
- grails - Grails 3.3.2 Spring Security CAS 不能通过负载均衡器工作,但可以通过部署在其上的内部服务器正常工作
- java - 在 Eclipse IDE 上的 Java 中,我在包行(类中的第一行)上收到错误