少し前に「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 にはテストケースがあるので、それを真似て書けると良いんだけど。