web-dev-qa-db-ja.com

フライウェイ:メタデータテーブルのない空でないスキーマ

Found non-empty schema "public" without metadata table! Use init() or set initOnMigrate to true to initialize the metadata table.

  • Postgis 2.0でPostgres 9.2を使用しています。つまり、デフォルトでは、新しいデータベースを作成すると、spatial_ref_sysというpublicスキーマにテーブルが作成されます。

このデータベースでflyway migrateを実行すると、上記のエラーが発生します。 initを実行すると、public.schema_versionテーブルが作成され、バージョン1を実際に移行ファイルを実行せずにSUCCEDEDとしてマークするようです。 initOnMigrateの組み合わせも試しましたが、成功しませんでした。 Flywayは、スキーマを管理するように構成されていません。

このシナリオで移行を実行する方法に関するアイデアはありますか?

27
markdsievers

PostGIS拡張機能を介してパブリックスキーマ内の多くのオブジェクトをインストールしたとき、データベースは実際にはバージンではないため、タイトルは多少矛盾しています。

あなたはどちらか

  • _flyway.schemas_を新しいスキーマ(my_appなど)に設定します。これは、Flywayによって自動的に作成されます。アプリケーションは、パブリックの代わりにこれを使用する必要があります(推奨)
  • _flyway.baselineOnMigrate_をtrueに設定するか、パブリックスキーマに対してflyway.baseline()を呼び出します。これは機能しますが、パブリックにはアプリケーションオブジェクトとPostGISオブジェクトの両方が含まれます
26
Axel Fontaine

Gradleを使用している場合は、実行できます

./gradlew -Dflyway.schemas=public flywayClean flywayMigrate

ここで、publicはschema_versionsテーブルを含むデータベースの名前です。これにより、テーブルとメタデータが削除され、移行を実行して最新の状態に戻す必要があります。

あぶない!

これにより、publicスキーマ内のすべてのデータが削除されます

3
ruby_newbie

このエラーは、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;

    }

}
2
Vikky