1

大きなファイルを手動で変換する手間を省くために、Eclipse 内で XML ファイルを SQL ステートメントに変換しようとしています。

次のような行:

<TABLE_NAME COL_1="value1" COL_2="value2"/>

次のように変換する必要があります。

insert into TABLE_NAME (COL_1, COL_2) values ("value1", "value2");

これまでのところ、テーブル名と最初の列/値のペアを次のように一致させてキャプチャすることができました。

<(\w+)( \w+)=(".+?").*/>

終わり近くは、パターンの.*最初の部分をテストするためだけにあり、完了したら削除する必要があります。

次の置換パターンは、次の結果をもたらします。

insert into $1 ($2) values ($3);
insert into TABLE_NAME ( COL_1) values ("value1");

私が抱えている問題は、列の数がテーブルごとに異なることです。そのため、n列/値のペアに一致し、キャプチャされたグループを置換パターンで繰り返し使用する汎用パターンが必要です。\G良い候補のようですが、これを行う方法をまだ理解できていません。

理想的には、これは単一の正規表現ステートメントで解決されますが、順番に実行する必要がある複数のステートメントにも反対しません (ただし、開発者に列ごとに 1 回実行させる必要はありません/値のペア)。

誰にもアイデアはありますか?

4

1 に答える 1

0

結局、当初想定していた正規表現でこれを解決しませんでした。代替ソリューションを念頭に置いて、テストコードをリファクタリングして再利用可能にし、テストを使用して開発データベースのさまざまな段階にデータを書き込むようにdbunitを採用することで、最終的に解決されました。

これがテストの誤用であることはわかっていますが、ユーザーはデータが挿入されているかどうかについて緑/赤のフィードバックを受け取り、同じテストデータを手動受け入れテストに挿入できるため、全体がはるかに簡単になります。自動化されたコンポーネント/統合テスト (メモリ内データベースで dbunit を使用) に使用されます。これらの偽のテスト クラスがテスト スイートに追加されない限り、手動でのみ実行されます。

結果として得られた偽のテストは、非常にシンプルで軽量になりました。たとえば、次のようになります。

public class MyComponentTestDataInserter extends DataInserter {
  @Override
  protected String getDeleteSql() {
    return "./input/component/delete.sql";
  }

  @Override
  protected String getInsertXml() {
    return "./input/component/TestData.xml";
  }

  @Test
  public void insertIntoDevStage() {
    insertData(Environment.DEV);
  }

  @Test
  public void insertIntoTestStage() {
    insertData(Environment.TEST);
  }
}

これには、IDE のコンテキスト メニューから単一のテスト メソッドを実行するだけで、開発者が単一の環境にデータを挿入できるという追加の利点もありました。同時に、テスト クラス全体を実行することで、まったく同じデータをすべての環境に同時にデプロイできます。

また、データのクリーンアップまたは挿入中の任意の時点で障害が発生すると、トランザクション全体がロールバックされ、不整合な状態が防止されます。

于 2012-06-19T07:17:40.263 に答える