使用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
相关产品推荐
相关产品推荐

