迁移后自动删除未使用列的非空约束
Automatically delete not-null constraints on unused columns after migration
我有一个与 GORM 结合使用的模型:
type User struct {
gorm.Model
Name string
Age uint
}
当我现在想使用 GORM Automigrate 命令将 Name
字段与 FirstName
和 LastName
交换时,我在下一个请求中收到以下错误:
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/goose
或 github.com/golang-migrate/migrate
.
我有一个与 GORM 结合使用的模型:
type User struct {
gorm.Model
Name string
Age uint
}
当我现在想使用 GORM Automigrate 命令将 Name
字段与 FirstName
和 LastName
交换时,我在下一个请求中收到以下错误:
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/goose
或 github.com/golang-migrate/migrate
.