私は、Grails プロジェクトで MySQL から Postgres へのかなり複雑なデータ移行を行うのに忙しくしています。
私は GORM を使用して PostGres でスキーマを生成し、MySQL -> mysqldump を実行し、いくつかのデータ操作を行ってから Postgres にインポートしています。
明らかに、MySQL から PSQL に移行するすべての人が当然のことと考えているのは、id 列の auto_inc です。その結果、次のマッピングを各ドメイン オブジェクトに追加しました (さまざまなサイトやガイドの指示に従って)。これにより、id 列のすべてのシーケンスが管理されます。
静的マッピング = { ID ジェネレーター:「シーケンス」 }
ただし、\d+ アカウントを実行すると、次の行が表示されます。
public.product ----------------------+------------------------------------------ --+-----------+----------+- ID | bigint | null ではない | プレーン |
...これは、私が期待するものとは多少異なります(シリアルまたはビッグシリアルであると予想しています)。とにかく、データを移行してからアプリケーションを開始し、/product/create アクションを介して製品を追加してこれをテストします。ダイスはありません。一意のキーについて不平を言う休止状態の例外がポップアップ表示されます (insert ステートメントid
は 2 の値を使用しようとしました。ページを数回更新します (さらに失敗しますが、それでも nextval を増やします)。最終的には142 (現在、テーブルには 141 個の製品があります)、そしてそれは成功します.したがって、明らかに、テーブルで使用される ID シーケンスのそれぞれで nextval を更新する必要があります.悲しいことに、wtf Grails が使用しているとは本当にわかりませんテーブルによって参照されていないため、シーケンスとしても、DB に新しいテーブルもありません。
( How to reset the postgres' primary key sequence when it fails out of sync? )のヒントを読みましたが、主キーにシリアルがないため、ここではあまり適していません。
min_lo 値を使用することもできますが (sequence
メソッドがヒロ以外の戦略の下限を考慮している場合)、理想的には、SQL を実行して移行後の修正を行うことができるものが欲しいです。
乾杯。
編集: PostGreSQL 9.1、Grails 2.0.3 (はい、これは移行後に更新されます)。