18

まず、背景を少し。私は一連の Java アプリケーションを持っています。一部は JPA に基づいており、一部はそうではありません。データベースを作成するために、現在 Hibernates スキーマ エクスポートを使用して、JPA を使用するデータベース用の作成スクリプトを生成しています。JPA を使用していない場合は、手動でスクリプトを生成します。これらは、ANT を使用したアプリケーションのインストール中に実行されます。更新の場合、アプリケーション インストーラーは更新スクリプトをデータベースに適用するだけです。

データベース更新の管理を改善するために、Flyway と Liquibase を検討しています。どちらも私が望むことをほぼ実行しているようです (余談ですが、既存のすべての SQL/DDL スクリプトがあるため、現時点では Flyway を優先しています)。私が見ることができる問題は、両方がデータベースを直接更新することです。これは多くのインストールでは問題ありませんが、すべてではありません。

私がやりたいことは、データベースに対して Flyway/Liquibase を実行し、データベースを最新の状態にするために必要なすべての更新を組み込んだ更新スクリプトを生成することです。これには、Flyway/Liquibase が独自のテーブルに加える必要がある変更も含まれます。これにより、私 (またはより重要なデータベース管理者) は、アプリケーションの外部で更新スクリプトを実行してデータベースを更新できます。次に、アプリケーション内で Flyway/Liquibase を純粋に使用して、データベースが最新であることを確認できます。

Flyway、Liquibase、またはその他のツールでこれを行うことは可能ですか?

4

5 に答える 5

12

Liquibaseはそれを非常にうまく処理します。現在の状態でデータベースを調べ、適用されていないチェンジセットを見つけて、 SQL出力モードupdateのコマンドでSQLスクリプトを生成します。

いずれにせよ、Hibernateジェネレーターの代わりに適切なデータベース移行ツールを使用することは、遅かれ早かれ、Hibernateがサポートしない状況に陥ることになります。私たちにとっては、一意のインデックスを削除して別のインデックスに置き換えていました。hibernate.hbm2ddl.auto=validateまた、データベース構造とエンティティBean間の互換性について安心できるようにすることもできます。

于 2013-01-23T15:23:55.050 に答える
4

必要なのはスキーマ差分ツールです。TOADにはかなり強力なものがあると聞いたのを覚えています。Hibernateは、検出したエンティティとデータベースメタデータに基づいてスキーマ更新スクリプトを生成しようとします。

ただし、必要なのは...それを行わず、代わりにFlywayを使用してすべてのデータベースを変更することです。つまり、Hibernatesの自動スキーマ更新をオフにして、今後は自分でスキーマ更新を作成する必要があります。データベースに変更を加えるたびに、スキーマの更新を作成する必要があります。

自動化されたスキーマ進化の更新を取得する方法として、スキーマの更新を休止状態にする方法のSQL出力をキャプチャする人もいます。@NotNull問題は、特に列を追加する場合、休止状態は通常間違っているということです。

また、管理者の観点から、Flywayはschema_versionテーブルとSQL / Java移行スクリプトに基づいて出力できると思います。SQL出力は実行されるため、DBAはFlywayの外部で実行できます(そうでない場合、これは簡単な機能です)たす)。

于 2013-01-23T15:13:34.353 に答える
3

はい、SQL スクリプトの生成は Liquibase の組み込み機能です。Liquibase が flyway より優れているもう 1 つの領域は、データベース コードの変更 (パッケージ、プロシージャ、関数) を移行できることです。私は flyway を使用していますが、それらの Liquibase 機能を flyway で利用できるようにしたいと考えています。

于 2013-01-29T18:40:44.397 に答える