3

私はデータ移行の世界に不慣れで、OurApp 1.0 を使用している顧客のデータを、OurApp 2.0 と互換性のあるスキーマを持つ新しいデータベースに移行する方法を探しています。データベースの変更管理やデータベースのリファクタリング タスクに Liquibase を推奨している人を何人も見てきました。

しかし、www.liquibase.org の資料を読んだ後、Liquibase は既存のデータを新しいスキーマに永続化できるように変換することよりも、スキーマを最新の状態に保つことに重点を置いているように感じました。

Employee テーブルの name という名前の列を、firstname と lastname の列に分割したいとします。Liquibase は、name 列を削除し、firstname と lastname 列を追加することで、テーブルを変更できます。しかし、Liquibase は、データベース内の既存のレコードの名前フィールドをファーストネームとラストネームに解析し、それらをそれぞれの列に格納する変換コードをプラグインするように構築されていないように感じます。

たとえば、私のテーブルがこのように見えたとします

id | name             | position
*********************************
12   Horace Slughorn    Professor
13   Albus Dumbledore   Headmaster

Liquibase を実行すると、name 列が firstname と lastname 列に置き換えられるため、データベース スキーマは正しくなります。しかし、Liquibase は、「Horace Slughorn」を「Horace」と「Slughorn」に解析し、これらの値をそのレコードの名と姓の列に格納するコードをプラグインできるフレームワークではないと推測しています。

id | firstname   |  lastname  | position
*****************************************
12   Horace         Slughorn         Professor
13   Albus          Dumbledore       Headmaster

そのため、Liquibase はスキーマを最新の状態に保ちますが、既存のデータを変換して新しいスキーマに一致させるようには設計されていません。そうですか?

4

2 に答える 2

6

Liquibase の目標は、データベースをあるバージョンから新しいバージョンに移行できるようにすることです。データベースの「リファクタリング」が多数組み込まれていますが、既存の文字列を分割する方法は実装に大きく依存するため、説明しているようにデータを分割するものはありません。

Liquibase では、1.9 ではカスタム変更クラス ( http://www.liquibase.org/manual/custom_refactoring_class ) を作成でき、2.0 ではより強力なカスタム変更サポート ( http://liquibase.org/extensions ) を作成できます。これは Java ベースであるため、スクリプトは Java で作成する必要がありますが、必要なデータの読み取りと操作を行うことができます。

注: 大量のデータがある場合、レコードを Java に読み取ってから書き戻すには時間がかかります。その場合、liquibase のタグを使用して、データベース内で分割を行うデータベース ベースの SQL ステートメントおよび/またはストアド プロシージャを作成できます。Liquibase は、分割が行われたことを追跡するのに非常に役立ち、再度行うべきではありません。

于 2010-09-03T05:14:47.067 に答える
1

カスタムSQLを作成する場合は、dbdeployを使用することもできます。LiquibaseはカスタムSQLの記述もサポートしており、DBMaintainまたはiBatisMigratorがあります。

于 2010-09-03T05:42:31.173 に答える