0

私は、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 (はい、これは移行後に更新されます)。

4

1 に答える 1

1

このドキュメントを参照してください。アプリを起動する前にシーケンスを更新する必要があります。

http://www.postgresql.org/docs/9.1/static/functions-sequence.html

currval(regclass)                   bigint  Return value most recently obtained with nextval for specified sequence
lastval()                           bigint  Return value most recently obtained with nextval for any sequence
nextval(regclass)                   bigint  Advance sequence and return new value
setval(regclass, bigint)            bigint  Set sequence's current value
setval(regclass, bigint, boolean)   bigint  Set sequence's current value and is_called flag
于 2013-05-06T19:07:37.860 に答える