LoginSignup
2
1

More than 3 years have passed since last update.

ridgepoleで既存テーブルのデータをコピーしたりTRIGGERを設定したりする

Posted at

前置き

古くからあるテーブル(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系操作するの結構疲れるなぁ。 :dash:

以上です。 :hugging:

参考

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1