Found non-empty schema "public" without metadata table! Use init() or set initOnMigrate to true to initialize the metadata table.
spatial_ref_sys
というpublic
スキーマにテーブルが作成されます。このデータベースでflyway migrate
を実行すると、上記のエラーが発生します。 init
を実行すると、public.schema_version
テーブルが作成され、バージョン1を実際に移行ファイルを実行せずにSUCCEDEDとしてマークするようです。 initOnMigrate
の組み合わせも試しましたが、成功しませんでした。 Flywayは、スキーマを管理するように構成されていません。
このシナリオで移行を実行する方法に関するアイデアはありますか?
PostGIS拡張機能を介してパブリックスキーマ内の多くのオブジェクトをインストールしたとき、データベースは実際にはバージンではないため、タイトルは多少矛盾しています。
あなたはどちらか
flyway.schemas
_を新しいスキーマ(my_appなど)に設定します。これは、Flywayによって自動的に作成されます。アプリケーションは、パブリックの代わりにこれを使用する必要があります(推奨)flyway.baselineOnMigrate
_をtrue
に設定するか、パブリックスキーマに対してflyway.baseline()
を呼び出します。これは機能しますが、パブリックにはアプリケーションオブジェクトとPostGISオブジェクトの両方が含まれますGradleを使用している場合は、実行できます
./gradlew -Dflyway.schemas=public flywayClean flywayMigrate
ここで、publicはschema_versionsテーブルを含むデータベースの名前です。これにより、テーブルとメタデータが削除され、移行を実行して最新の状態に戻す必要があります。
これにより、public
スキーマ内のすべてのデータが削除されます
このエラーは、Flywayの最新バージョン、つまり4.03以上でのみ発生すると思います。以前のプロジェクトでは受け取りませんでしたが、最新のプロジェクトでFlywayバージョン5.07を使用しているときに受け取りました。私の問題を解決するコードをここに置く
public class FlywayConfig {
@Autowired
DataSource dataSource;
@Autowired
Config config;
@Bean
public Flyway flyway(){
Flyway flyway = new Flyway();
flyway.setDataSource(dataSource);
flyway.setSqlMigrationPrefix("V");
flyway.setLocations(new String[] { config.getSqlLocation() });
flyway.setBaselineOnMigrate(true);
// *******************flyway.clean(); ********************// this will wipe out the DB, be careful
flyway.migrate();
return flyway;
}
}