前置き
古くからあるテーブル(old_posts
)を新しいテーブル(new_posts
)に切り替える対応をしていて、その過程でレコードを同期するためにridgepoleでいろいろ操作したのでそのメモです。
コード
# old_postsにある既存のレコードをすべてnew_postsにコピーする
execute(<<-COPY) do |c|
INSERT INTO new_posts(title, content, created_at, updated_at)
SELECT title, content, created_at, updated_at FROM old_posts;
COPY
# まだnew_postsにレコードがない場合のみ実行
c.raw_connection.query(<<-SQL).count.zero?
SELECT 1 FROM new_posts
SQL
end
# TRIGGERを設定して、old_postsへのレコード追加時にnew_postsにもレコード追加する
execute(<<-TRIGGER) do |c|
CREATE TRIGGER copy_post AFTER INSERT ON old_posts
FOR EACH ROW
BEGIN
INSERT INTO new_posts(title, content, created_at, updated_at)
VALUES (NEW.title, NEW.content, NEW.created_at, NEW.updated_at);
END;
TRIGGER
# まだcopy_post TRIGGERがない場合のみ実行
c.raw_connection.query(<<-SQL).count.zero?
SHOW TRIGGERS WHERE `Trigger` = 'copy_post'
SQL
end
今回は扱うテーブルの性質上、レコード更新/削除時は考慮していません。
(必要な場合は別途TRIGGERを追加していけばOK)
このあと、モデルのテーブル名を変更するなどの対応を進めていく予定。
いやー、DB系操作するの結構疲れるなぁ。
以上です。