我正在尝试使用 Gorm 定义自定义联接表并遵循文档此处。
更新:我的问题是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
SetupJoinTable
只设置表结构,只有必要的关键字段来建立表之间的关系。
因此您还需要为您的
AutoMigrate
表运行 UserBooks
。
err = db.AutoMigrate(&User{}, &Book{}, &UserBooks{})