错误1452:无法新增或更新子数据列(GOLANG AND MYSQL)

cnh2zyt3  于 2022-11-28  发布在  Mysql
关注(0)|答案(1)|浏览(158)

我是一个golang实习生。我有一个问题使用外键在gorm。我试图写一个crud operation.im使用gorm和使用外键时的错误:错误1452:无法添加或更新子行。
第一个
我得到了这个错误:
2022年11月23日14:31:33 /home/channellead/文档/博客-服务-go/内部/活动/博客/内容/行动.go:26错误1452:无法添加或更新子行:外键约束失败
service-blog-go. contents,约束fk_contents_category_model外键(cat_id)引用categoriesid))[3.247ms] [行:0]插入到contentscreated_atupdated_atdeleted_atcat_idtitlecontent)值(“2022年11月23日14:31:33.972 ',”2022年11月23日14:31:33.972',空值,0,“霍达亚卡卡斯卡斯dg”,“测试”)

zi8p0yeb

zi8p0yeb1#

请注意插入查询。您将0指定为cat_id,它引用了Category表的ID。但是在Category表中没有带有0 ID的条目。另一个重要的事实是,如果您使用gorm.Model,则不需要显式使用ID,因为它内部有一个ID字段。CategoryModel字段应该被重命名为Category。这些是默认的,但是你可以配置这些东西。请阅读documentation。下面是工作代码GITHUB LINK。你可以克隆repo并运行。

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)
}

参考:Gorm Has One

相关问题