csdn0811 2024-04-09 17:01 采纳率: 60.7%
浏览 62
已结题

gorm中 AutoMigrate 方法自动更新数据表的类型问题

gorm中 使用AutoMigrate 方法总是自动更新数据表的类型问题

r := gin.Default()
    err := database.Db.AutoMigrate(&model.Article{})
    if err != nil {
                panic("Failed to migrate database!")
        }
.....

// 在结构体中,我已经指定了数据库的类型,但数据库中总是自动更新数据表的字段类型为其他类型,并且一直报错:
[215.245ms] [rows:4] ALTER TABLE article_cate MODIFY COLUMN state bigint
Error 3780 (HY000): Referencing column 'article_cate_id' and referenced column 'id' in foreign key constraint 'fk_article_article_cate' are incompatible.
[1.077ms] [rows:0] ALTER TABLE article ADD CONSTRAINT fk_article_article_cate FOREIGN KEY (article_cate_id) REFERENCES article_cate(id)
panic: Failed to migrate database!

type Article struct {
    gorm.Model
    Title         string      `gorm:"type:varchar(255)"`
    ArticleCateId int         `gorm:"type:int"`
    State         int         `gorm:"type:int"`
    ArticleCate   ArticleCate `gorm:"foreignKey:ArticleCateId"`
}

func (Article) TableName() string {
    return "article"
}

type ArticleCate struct {
    ID    int
    Title string `gorm:"type:varchar(255)"`
    State int    `gorm:"type:int"`
}

func (ArticleCate) TableName() string {
    return "article_cate"
}
  • 写回答

3条回答 默认 最新

  • GISer Liu 2024-04-09 18:13
    关注

    该回答引用自GPT-3.5,由博主GISer Liu编写:

    根据你的描述,问题出现在使用 GORM 的 AutoMigrate
    方法时,它似乎自动更新数据表的字段类型,导致数据库中的字段类型与你在结构体中指定的类型不一致,进而引发了报错。
    让我们逐步分析和解决这个问题:

    1. 报错分析 : 报错信息中提到了以下两个问题:
    • ALTER TABLE article_cate MODIFY COLUMN state bigintError: 涉及到字段类型变更,但报错信息并没有提供具体的修改内容。
    • Error 3780 (HY000): Referencing column 'article_cate_id' and referenced column 'id' in foreign key constraint 'fk_article_article_cate' are incompatible.:这个错误表明了外键约束出现了问题,可能是由于类型不匹配导致的。
    1. 解决方案 : 针对这个问题,可以采取以下步骤进行解决:
    • 手动定义数据表结构 :停止使用 AutoMigrate 方法自动更新数据表结构,而是手动在数据库中定义数据表结构,确保字段类型和约束的正确性。
    • 明确指定字段类型 :在 GORM 的结构体标签中,明确指定字段的类型,这样可以避免 GORM 根据默认规则自动推断字段类型。
    • 注意外键约束 :在设计外键关系时,确保参与关联的字段类型一致,否则可能会引发数据库约束错误。
      根据你提供的代码,结合上述解决方案,我们可以做出如下修改:
      goCopy code
      type Article struct {
      gorm.Model
      Title         string      `gorm:"type:varchar(255)"`
      ArticleCateID int         `gorm:"type:int"` // 修改为 ArticleCateID,并确保类型一致
      State         int         `gorm:"type:int"`
      ArticleCate   ArticleCate `gorm:"foreignKey:ArticleCateID"`
      }
      func (Article) TableName() string {
      return "article"
      }
      type ArticleCate struct {
      ID    int
      Title string `gorm:"type:varchar(255)"`
      State int    `gorm:"type:int"`
      }
      func (ArticleCate) TableName() string {
      return "article_cate"
      }
      
      以上是对代码的修正,需要注意的是,我将 ArticleCateId 改为了 ArticleCateID,这是为了保持一致性。另外,要确保 ArticleCateID 的类型与 ArticleCate 结构体中的 ID 字段类型一致。
      总结一下,通过手动定义数据表结构,明确指定字段类型,并确保外键约束的正确性,可以解决这个问题。

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 6月1日
  • 已采纳回答 5月24日
  • 创建了问题 4月9日