@Xveeder

Почему миграции GORM падают при повторном запуске?

Доброго времени суток. Недавно начал изучать Go и дошел до работы с БД.

Обнаружил, что существующие механизмы миграции в Go отличаются от привычных механизмов в Python. Из существующих решений я видел ручные миграции через консоль и GORM-миграции.

О последних подробнее. Использую стандартный механизм, объявляю структуры-модели, пропихиваю их в AutoMigrate. Запуск автомиграций я инициализирую во время запуска приложения. Все работает замечательно, но когда я запускаю приложение второй раз (а с ним и миграции) они падают, потому что такие таблицы уже создавались (что логично). Или, например, если я добавляю или удаляю поле таблицы, вместо изменения этой таблицы происходит попытка вставить новую.

Пример запуска миграции:

var migrations = []interface{}{
	&user.UserModel{},
	&ticket.TicketModel{},
}

func RunMigration() {
	CONNECTION.AutoMigrate(migrations...)
}

Пример ошибки:

ERROR: relation "XXXXXXXXX" already exists (SQLSTATE 42P07)

Вопрос: можно ли как-то поправить эту логику, чтобы не сбоило ошибками при каждом повторном запуске. Видел много примеров на гитхабе, где миграции запускаются в main.
  • Вопрос задан
  • 148 просмотров
Пригласить эксперта
Ответы на вопрос 1
@sergomyaso
Вообще хотелось бы взглянуть в определение структурок моделей, а так из простых решений есть вариант сделать проверку, что если таблицы уже созданы, то пропускаем эту ошибку:

err := CONNECTION.AutoMigrate(migrations...).Error
  if err != nil && !strings.Contains(err.Error(), "already exists")  {
      // ошибку, что таблицы уже существуют, можно пропустить и обработать другие
  }

// Do magic
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы