Ошибка грязной версии базы данных при использовании golang-migrate

Я новый пользователь golang-migrate.

Я успешно выполнил несколько миграций.

Я нахожусь в режиме разработки, поэтому я хочу повторно запустить миграции, поэтому в 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. Исправьте и принудительно установите версию.

Что это за ошибка и как с ней бороться?

5 ответов

Решение

Грязная база данных версии 2 означает, что вы попытались выполнить миграцию версии 2, но это не удалось.

База данных может быть несогласованной или поврежденной, если миграция не удалась.

Повторный запуск дополнительных миграций поверх прерванного состояния непредсказуем, и поэтому миграции блокируются до тех пор, пока вы не очистите базу данных.

https://github.com/golang-migrate/migrate/blob/master/FAQ.md

Что значит "грязная" база данных?

Перед запуском миграции каждая база данных устанавливает грязный флаг. Выполнение останавливается, если миграция завершается неудачно, и грязное состояние сохраняется, что предотвращает попытки выполнить дополнительные миграции поверх неудачной миграции. Вам нужно вручную исправить ошибку, а затем "принудительно" установить ожидаемую версию.

После очистки базы данных вы также можете открытьschema_migrations таблицу и измените флаг грязности и номер версии отката на последнюю успешно примененную миграцию.

В этом случае вам, вероятно, придется исправить ошибку вручную.

Затем с помощью инструмента CLI вы можете очистить базу данных. В основном вы должны запустить:migrate -path PATH_TO_YOUR_MIGRATIONS -database YOUR_DATABASE_URL force VERSION, где N — текущее состояние БД.

Подробнее об этом можно прочитать в документации по началу работы.

Перейдите в свою консоль 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
}
Другие вопросы по тегам