У меня есть приложение Spring Boot, которое использует Flyway для миграции баз данных в Postgres.
Сейчас ему около четырех лет, поэтому мы говорим о Flyway 4.0.3, Spring Boot 1.3.x и Postgres 9.х. Версии, вероятно, можно было бы обновить, но я бы хотел исправить все существующие проблемы, прежде чем делать это.
В то же время, Postgres был повышен до уровня выше 9.x. К сожалению, при этом некоторые из существующих миграций устарели, поскольку содержат устаревший синтаксис. Так что теперь запуск приложения с базой данных fre sh (то есть в среде разработки) приводит к сбоям этих миграций. В производстве это нормально, поскольку эти миграции уже были применены и больше не будут применяться.
Мне любопытно, каковы лучшие методы go по этому поводу. Я не могу просто go и исправить синтаксис в существующих миграциях, так как это приведет к сбою контрольных сумм в производственной среде. Я знаю, repair
- вещь, но я не уверен, как она работает и как ее использовать с Spring Boot.
Failing SQL:
UPDATE config
SET (description) = 'my description'
WHERE ...
Правильно SQL:
UPDATE config
SET description = 'my description'
WHERE ...
Ошибка:
Message : ERROR: source for a multiple-column UPDATE item must be a sub-SELECT or ROW() expression
РЕДАКТИРОВАТЬ 24/04/2020 Решение Spring Boot:
После того, как Грант Фитчи отправил правильный ответ о как использовать repair
для этого ниже, я просто добавлю, как я делал это специально с Spring Boot. Я только что создал компонент FlywayMigrationStrategy
, который вызывает repair
перед вызовом migrate
:
@Bean
public FlywayMigrationStrategy cleanMigrateStrategy() {
return flyway -> {
flyway.repair();
flyway.migrate();
};
}
При развертывании этого в производственной среде во время запуска контрольные суммы в таблице schema_versions
в Postgres были исправлены. В другой версии я снова удалю строку flyway.repair();
, так как в противном случае это, очевидно, создаст риск применения недопустимых миграций.