使用 golang-migrate 时出现脏数据库版本错误



我是golang-migrate的新用户。

我已经运行了一些成功执行的迁移。

我处于开发模式,所以我想重新运行迁移,以便在 shell 中psql连接到我的数据库后,我执行了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并将 Dirty 标志和回滚版本号更改为上次成功应用的迁移。

转到您的 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 是数据库的当前状态。

您可以在入门文档中阅读更多相关信息

最新更新