Ошибка грязной версии базы данных при использовании 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
}