You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Gorm自定义关联表时created_at/deleted_at字段未创建的问题

问题:自定义Gorm多对多关联表未生成created_at和deleted_at字段

按照Gorm自定义多对多关联表的方式配置后,关联表user_books的created_at和deleted_at字段始终未被创建,执行插入操作时提示以下错误:

ERROR: column "created_at" of relation "user_books" does not exist (SQLSTATE 42703)
[1.066ms] [rows:0] INSERT INTO "user_books" ("user_id","book_isbn","created_at","deleted_at") VALUES (6,'1785041851','2024-04-02 21:54:01.082',NULL) ON CONFLICT DO NOTHING

ERROR: column "created_at" of relation "user_books" does not exist (SQLSTATE 42703)
[7.967ms] [rows:1] UPDATE "users" SET "created_at"='2024-04-02 21:46:34.3',"updated_at"='2024-04-02 21:54:01.078',"deleted_at"=NULL,"name"='MockUser' WHERE "users"."deleted_at" IS NULL AND "id" = 6

实体结构

type User struct {
    gorm.Model
    Name  string
    Books []Book `gorm:"many2many:user_books"`
}

type Book struct {
    ISBN  string `gorm:"primaryKey"`
    URL   string `json:"url"`
    Title string `json:"title"`
}

type UserBooks struct {
    UserId    int    `gorm:"primaryKey"`
    BookISBN  string `gorm:"primaryKey"`
    CreatedAt time.Time
    DeletedAt gorm.DeletedAt
}

自动迁移代码

err = db.AutoMigrate(&User{}, &Book{})
err = db.SetupJoinTable(&User{}, "Books", &UserBooks{})

保存实体代码

var book Book
cfg.Database.Table("books").Find(&book, isbn)
user.Books = append(user.Books, book)
err = cfg.Database.Table("users").Save(&user).Error

解决方案

1. 自动迁移时包含关联表结构体

修改AutoMigrate代码,将自定义关联表UserBooks也传入,让Gorm自动生成该表的所有字段:

err = db.AutoMigrate(&User{}, &Book{}, &UserBooks{})

2. 确保SetupJoinTable在AutoMigrate之后执行

保持SetupJoinTable在AutoMigrate之后调用,确保Gorm先创建好所有表结构,再配置多对多关联关系:

err = db.AutoMigrate(&User{}, &Book{}, &UserBooks{})
if err != nil {
    // 处理迁移错误
}
err = db.SetupJoinTable(&User{}, "Books", &UserBooks{})

3. 验证表结构

执行迁移后,检查user_books表是否存在created_at和deleted_at字段,确认字段类型与结构体定义一致。


内容的提问来源于stack exchange,提问作者Martin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 10:41:21