雑文発散

«前の日記(2015-08-02) 最新 次の日記(2015-08-04)» 編集
過去の日記

2015-08-03 [長年日記]

[Embulk] embulk-output-mysql の merge モードのカスタマイズをしていた

少し前に「merge モードのときに UPDATE 対象のカラムが限定できる機能」について日記に書いたのだけど、その機能を作ってみている。

この前は ON DUPLICATE KEY UPDATE の構文を組み立てるメソッドに mergeKeys という変数が渡っているので、そいつを使っちゃえば良いのでは?と思いつつも embulk-output-postgresql での使われ方が違う気がしていて、そういう意図の変数じゃないなという感触を得ていたので、別の設定を使ってみることにした。

column_options という設定があったので、そこにキーワード skip_update を新たに作り、その値が true だった場合に ON DUPLICATE KEY UPDATE 以下のカラム指定から外すようにしてみている。

out:
  type: mysql
  [snip]
  mode: merge_direct
  column_options:
    created_at: {skip_update: true}

merge_direct モードで通常発行される下記のクエリ(以前の日記と同じもの)のがあるとして、

INSERT INTO ramen (
  name,
  location,
  created_at,
  updated_at)
VALUES (
  'しじみラーメン和歌山',
  '青森',
  '2015-07-19',
  '2015-07-19' )
ON DUPLICATE KEY UPDATE
  name = VALUES(name),
  location = VALUES(location),
  created_at = VALUES(created_at), -- <= here
  updated_at = VALUES(updated_at)
;

前述の設定をした場合には、このようなクエリが発行されるイメージ。

INSERT INTO ramen (
  name,
  location,
  created_at,
  updated_at)
VALUES (
  'しじみラーメン和歌山',
  '青森',
  '2015-07-19',
  '2015-07-19' )
ON DUPLICATE KEY UPDATE
  name = VALUES(name),
  location = VALUES(location),
  updated_at = VALUES(updated_at)
;

いちおう動いている気はするけど、自分のコードには自信がないので、もう少しテストをしたいところ。残念ながら embulk-output-mysql にはテストケースが用意されていないので、最初から自分で書くしかないんだよなぁ。

embulk-output-oracle にはテストケースがあるので、それを真似て書けると良いんだけど。