我是 golang-migrate 的新用户。
我已经运行了一些成功执行的迁移。
我处于开发模式,所以我想重新运行迁移,因此在
psql
shell 中,连接到我的数据库后,我执行了 drop database schema_migrations
现在的问题是,当我运行执行迁移的代码时(如下所示)
func RunMigrations() {
m, err := migrate.New(
"file://db/migrations",
"postgres://postgres:postgres@localhost:5432/mydatabase?sslmode=disable")
if err != nil {
log.Fatal(err)
}
if err := m.Up(); err != nil {
if err.Error() == "no change" {
log.Println("no change made by migration scripts")
} else {
log.Fatal(err)
}
}
}
我收到此错误
脏数据库版本2。修复并强制版本。
此错误是什么?我该如何解决此问题?
脏数据库版本 2 意味着您尝试运行迁移 v2 但失败。
如果迁移失败,数据库可能会不一致或损坏。
在损坏状态之上重新运行其他迁移是不可预测的,因此在清理数据库之前迁移会被阻止。
https://github.com/golang-migrate/migrate/blob/master/FAQ.md#what-does-dirty-database-mean
“脏”数据库是什么意思?
在迁移运行之前,每个 数据库设置脏标志。如果迁移失败并且执行将停止 脏状态持续存在,这会阻止尝试运行更多 在失败的迁移之上进行迁移。您需要手动修复 错误,然后“强制”预期版本。
清理数据库后,您还可以打开
schema_migrations
表并将脏标志和回滚版本号更改为成功应用的上次迁移。
转到您的 postgres 控制台并在 Schema_Migrations 表中查找详细信息。
如果您看到 Dirty=true 那么您已经找到了根本原因,您只需通过运行更新查询来更新即可。
看看下面的命令。
select * from schema_migrations;
update schema_migrations set dirty =false where version=XXXX;
我通过将脏标志更新为零解决了此错误。 就我而言,我的数据库名称是“auth”。因此,我首先运行以下命令来检查脏版本。
select * from auth_migrations
在输出中我发现脏列的值为 1。
然后我将其更新为零,我的问题就解决了。
注意:如果您的数据库名称是“exampleDb”,那么您的脏版本将位于“exampleDb_migrations”中
如果删除
schema_migrations
表,您可以通过强制迁移版本来重新创建它。
例如
m, err := migrate.New("file://db/migrations","postgres://postgres:postgres@localhost:5432/mydatabase?sslmode=disable")
if err != nil {
log.Fatal(err)
}
err := m.Force(11) //11 is migrations version number, you may use your latest version
if err != nil {
return err
}
发生这种情况时,您可能需要手动修复错误。
然后,使用 CLI 工具您可以清理数据库。基本上你应该运行:
migrate -path PATH_TO_YOUR_MIGRATIONS -database YOUR_DATABASE_URL force VERSION
,其中 N 是 DB 的当前状态。
您可以在入门文档
了解更多信息