GORM 数据库中的自动迁移将不需要的字段添加到 SQL table

Automigrate in GORM database adds unwanted fields to SQL table

当我在 gorm 数据库中创建 table 时,它会向 table 添加我不需要的列。我不确定它是如何添加这些额外字段的。这导致我 运行 出现错误,指出 "pq: null value in column "user_id" 违反了非空约束"。 "user_id" 是添加的不需要的列。我正在使用 gorm 和 postgreSQL。

我的两个 table 之间存在多对多关系。我的第一个 table 已正确创建,第二个 table 商店是使用提供的字段加上两个不需要的字段创建的:"user_id" 和 "stores_id"。我尝试删除多对多关系以查看是否是问题所在,我尝试删除 tables 并使用不同的字段重新创建它们。不管怎样,我还是没能去掉多余的两列。

第一个(工作)table:

type User struct {
    gorm.Model
    ID int `json:"u_id"`
    Name string `json:"u_name"`
    Stores []Store `gorm:"many2many:stores;" json:"stores"`
}

当我执行'\d users'时,我得到以下列:id, created_at, updated_at, deleted_at, name.

第二个(有问题)table:

type Stores struct {
    gorm.Model
    ID int `json:"s_id"`
    NUM int `gorm:"unique" json:"s_num"`
    Users []User `gorm:"many2many:user" json:"users"`
}

当我执行 '\d' 商店时,我得到以下列:user_id、vehicle_id、id、created_at、updated_at、deleted_at, 数量

我正在通过以下代码执行这些 table 的创建:

db.AutoMigrate(&User{})
db.AutoMigrate(&Store{})

另一方面,如果我将 gorm:"primary_key";auto_increment" 添加到我的结构中的 ID 值,我会收到错误消息“pq: column "user_id" appears twice in primary key constraint”。我能够通过删除 primary_key 和 auto_increment 属性来解决这个问题,运行ning AutoMigrate() 然后将其重新添加并再次 运行ning AutoMigrate() -这非常好并且可以正常工作。

我也试过手动插入 user_id 和 store_id。这很好用,除了我每次都必须生成新的,因为它们需要唯一性。我知道错误 "pq: null value in column "user_id" violates not-null constraint" 是由于我在创建时没有提供 user_id 或 store_id我的商店。我很困惑为什么会生成 user_id 和 store_id 列,我希望我能解决这个问题。

这就是 gorm.Model 的样子

type Model struct {
  ID        uint `gorm:"primary_key"`
  CreatedAt time.Time
  UpdatedAt time.Time
  DeletedAt *time.Time
}

当我们在结构中调用 gorm.Model 时,这意味着我们在当前结构中添加 gorm.Model 的默认字段。

type Stores struct {
    gorm.Model
....

所以你的用户模型看起来像

ype User struct {
    ID        uint `gorm:"primary_key"`
    CreatedAt time.Time
    UpdatedAt time.Time
    DeletedAt *time.Time
    ID int `json:"u_id"`
    Name string `json:"u_name"`
    Stores []Store `gorm:"many2many:stores;" json:"stores"`
}

该错误可能是由于 primary_key 密钥重复造成的。尝试将 ID intjson:"u_id"`` 重命名为 UserID。你也需要更新 Stores

通过删除 gorm.Model 修复了重复的 ID 错误,@(Akshaydeep Girl)指出 gorm.Model 意味着什么。至于一直自动添加的随机'user_id'和'store_id',是因为many2many gorm关系才添加的。我能够通过切换迁移顺序来删除它们。

func DBMigrate(db *gorm.DB) *gorm.DB {
    db.AutoMigrate(&Store{})
    db.AutoMigrate(&User{})
    return db
}

当我用新的迁移顺序删除 tables 和 re-compiled/ran 我的项目时,商店 table 是在没有随机 'user_id' 和 'store_id',而用户 table 也没有。