前回はSQLServerの追加したデータのみをCSVに出力しましたが、今回はSQLServerにInsertします。
ついでに前回は追加データの判定をするカラムを主キーのみに設定していましたが、今回は主キーに設定されていない日付カラムを指定して実施していきます。
SQLServerに出力する場合は、以下のプラグインを使用します。
github.com
実施作業
プラグインインストール
最初に必要なプラグインを以下のコマンドでインストールします。
embulk gem install embulk-output-sqlserver
インストールが正常終了したら、以下のコマンドでインストールできていることを確認します。
embulk gem list
テストデータ作成
連携するテストデータを作成します。
データ連携先テーブル準備
EmbulkでSQLServerに連携する場合、テーブル名まで具体的に指定する必要があります。
そのため事前に連携先のDBとテーブルが作成されていないといけないので、事前に空のテーブルを作成しておきます。
※今回のやり方であれば、多少手間は増えますがバックアップから連携先DBをリストアするのでも問題ないと思います
Embulkの設定ファイル作成
Embulkの実行に必要な設定ファイルを作成します。
※ファイル内に設定する接続情報は、それぞれ事前に接続ができることを確認しておきます
※パスワードは検証用に簡単なものを設定しています
in: type: sqlserver driver_path: C:\drivers\sqljdbc_7.2\jpn\mssql-jdbc-7.2.2.jre8.jar host: EC2AMAZ-L2BKFDH user: dbuser password: "dbuser" database: TESTDB schema: dbo table: Employee incremental: true incremental_columns: - RegDate out: type: sqlserver driver_path: C:\drivers\sqljdbc_7.2\jpn\mssql-jdbc-7.2.2.jre8.jar host: EC2AMAZ-JGN0VFT user: dbuser password: dbuser database: TESTDB schema: dbo table: Employee mode: insert_direct
ここで特筆するのは以下の2つです。
①incremental_columnsパラメータに日付カラムを指定
②insert modeパラメータは直接Insertする値を設定
insertするにはいくつか設定値がありますが、今回は中間テーブルを作成しない「insert_direct」を設定します。
※「insert」を設定すると実行前に中間テーブルを作成するため、処理時間や容量への影響が少なからず発生します
※その場合中間テーブルは処理の最後に削除されます
guessコマンド実行
以下のコマンドで設定ファイルを作成します。
embulk guess .\try1\sqlserver_incremental_to_sqlserver.yml -o config_inc_to_sqlserver.yml
出力されたファイルは以下です。
runコマンド実行(初回実行)
設定ファイルの作成ができたら、rumコマンドでEmbulkで実行します。
embulk run .\config_inc_to_sqlserver.yml -c embulk_sql_inc_sqlserver.diff.yaml
初回実行なので、INSERT INTOで全件が追加されているログが出力されていることが確認できます。
データ確認(初回実行)
データを転送した先のDBでSelect文を実行して、想定通りデータが取得できることを確認します。
追加データ作成
SQLで50件ほど追加でデータを作成します。
※日付は一意ではなくて、敢えて全部同じ日付を設定しています。
runコマンド実行(2回目実行)
再度runコマンドを実行し、増分データのみを取得するようにSQLが発行されていることを、出力されたメッセージから確認できます。
データ確認(初回実行)
転送先で再度Selectを実行して、データが追加されていることを確認できました。
※重複追加もされていないことも確認できました。
感想及び所感
主キー以外をカラムに設定しても問題なく実行できることがわかりました。(まぁ内部ではただSQLを実行しているだけなので、当たり前といえば当たり前ですが)
incremental_columnsカラムには複数設定ができるので、例えば主キーが複数ある場合やデータを特定カラムでソートして連携したい場合でも対応できると思います。