im a golang intern .我在 gorm 中使用外键时遇到问题。我尝试使用 gorm 编写 crud operation.im,使用外键时出现错误:错误 1452:无法添加或更新子行。
package migrations
import "gorm.io/gorm"
type Category struct {
gorm.Model
ID uint
Title string `gorm:"type:varchar(255)"`
Sort int
}
package migrations
import "gorm.io/gorm"
type Contents struct {
gorm.Model
ID uint
CategoryModel Category `gorm:"foreignKey:cat_id"`
CatId uint
Title string `gorm:"type:varchar(255)"`
Content string `gorm:"content,type:varchar(255)"`
}
我得到了这个错误:
2022/11/23 14:31:33/home/channelead/Documents/blog-service-go/internal/activities/blog/Content/action.go:26 错误 1452:无法添加或更新子行:外键约束失败
(
service-blog-go
.contents
、约束fk_contents_category_model
外键(cat_id
)引用categories
(id
)) [3.247毫秒] [行:0]插入contents
(created_at
,updated_at
,deleted_at
,cat_id
,title
,content
) 值 ('2022-11-23 14:31:33.972','2022-11-23 14:31:33.972',NULL,0,'霍达亚 csacas DG','test ')
请注意插入查询。您0
作为引用表Category
ID 的cat_id
。但是Category
表中没有带有0
ID 的条目。另一个重要的事实是,如果您使用gorm.Model
,则不需要显式ID
,因为它内部有一个ID
字段。并且 类别模型 字段应重命名为类别。这些是 gorm 默认值,但您可以配置这些内容。请阅读文档。这是工作代码GITHUB LINK。您可以克隆存储库并运行。
package storage
import (
"fmt"
"log"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
type Category struct {
gorm.Model
Title string `gorm:"type:varchar(255)"`
Sort int
}
type Contents struct {
gorm.Model
Category Category
CategoryID uint
Title string `gorm:"type:varchar(255)"`
Content string `gorm:"type:varchar(255)"`
}
func GormTest3() {
db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{
Logger: logger.Default.LogMode(logger.Info),
})
if err != nil {
log.Fatal("could not open database")
}
err = db.AutoMigrate(&Contents{}, &Category{})
if err != nil {
log.Fatal("could not migrate database")
}
createTestData3(db)
fetchData3(db)
}
func createTestData3(db *gorm.DB) {
category := Category{
Title: "ABC",
Sort: 1,
}
err := db.Create(&category).Error
if err != nil {
fmt.Println("failed to create user data")
}
content := Contents{
CategoryID: category.ID,
Title: "Good Content Title",
Content: "Good Content",
}
err = db.Create(&content).Error
if err != nil {
fmt.Println("failed to create user data")
}
}
func fetchData3(db *gorm.DB) {
var cts []Contents
if err := db.Find(&cts).Error; err != nil {
fmt.Println("failed to load post")
}
fmt.Println(cts)
}
参考: 戈尔姆有一个