迁移后自动删除未使用列的非空约束

Automatically delete not-null constraints on unused columns after migration

我有一个与 GORM 结合使用的模型:

type User struct {
    gorm.Model
    Name  string
    Age    uint
}

当我现在想使用 GORM Automigrate 命令将 Name 字段与 FirstNameLastName 交换时,我在下一个请求中收到以下错误:

ERROR: null value in column "name" violates not-null constraint (SQLSTATE 23502)

显然,AutoMigrate 不会破坏用户 table 中的 Name 列(如文档中所述),但它也不会破坏非空约束,这使得table迁移后无用。

如何自动销毁旧列的非空约束?

据我所知,它不能自动完成。

正如您所注意到的,gorm 不会删除 table 中的旧列,因此从本质上讲,一旦您删除了该字段,gorm 就会忘记该列。清楚的是,在某些时候您已经用 gorm:"not null" 标记了 Name 字段,否则不会施加该约束。 因此,您可以逆转的一种方法是恢复旧字段,但删除 not null 标记,然后 运行 迁移。这将删除非空约束。然后删除该字段,并再次运行 迁移。无论如何都不是自动的。

您还可以考虑使用 migrator 创建您自己的迁移脚本,以删除约束甚至完全删除该列。

以我的拙见,Gorm 的自动迁移功能目前仅适用于快速制作原型。我认为除了玩具应用程序之外,它无法替代适当的迁移系统;迟早你 运行 会遇到这些迫使你自己编写仔细的迁移脚本的问题。要查看的包包括 github.com/pressly/goosegithub.com/golang-migrate/migrate.