らいむぎばたけ

つかまえなくてだいじょうぶ

メディレコでカラムで持っていた値をテーブルで持つようにした

はじめに

メディレコ は三年くらい前に FJORD BOOT CAMP の最終課題で作った Web アプリ。詳しくはこちらの記事にかいているけど、今読むとちょっとけっこうかなりとても恥ずかしい。自分のために作ったアプリだったが、両親も割と使ってくれていて、バグの報告をしてくれるので助かっている。

lime1024.hateblo.jp

当時はテーブル設計について特に考えていなかったが、最近になって見てみるとテーブルに分離したほうが良さそうなカラムに気づいたので、新しいテーブルの作成・移行・カラムの削除を行った。

テーブル

変更前のスキーマ (一部省略)

  • medical_bills
カラム名 備考
day 日付
cost 費用
classification 医療費区分 (治療費・医薬品費・交通費)

変更後のスキーマ (一部省略)

  • classifications
カラム名 備考
name 医療費区分 (治療費・医薬品費・交通費)
  • medical_bills
カラム名 備考
day 日付
cost 費用
classification_id 紐づく classifications テーブルの id

やったこと

細かい手順書は issue にまとめてある

1. 新しいテーブルの作成

  • 医療費テーブル (medical_bills) でカラムとしてもっていた医療費区分 (medical_bills.classification) を医療費区分テーブル (classifications) にした
  • カラム名とテーブル名が同じになるので、一時的にテーブルへのアソシエーションにアンスコをつけて _classifications とした
    • medical_bill.classification: カラムのときの医療費区分
    • medical_bill._classification: テーブル分離後の医療費区分
  • seed の用意
    • 医療費区分は、治療費・医薬品費・交通費の 3 つに決まっているので DB に流す seed を用意した

2. 移行スクリプトの作成と移行

  • 移行スクリプトの作成
    • medical_bill.classification 内の文字列 (治療費・医薬品費・交通費) を見て medical_bill.classification_id を追加
  • 移行作業
    • DB のバックアップ
    • テーブル作成のコードのデプロイ
    • seed データを流す
    • 移行対象数を数えるスクリプトを流す
    • 移行スクリプトを実行する
    • 移行対象数を数えるスクリプトを流す (0 になっていたら完了)

3. 後片付け

  • カラムの削除 (medical_bills.classification)
  • アソシエーションの修正 (medical_bills._classification のアンスコをやめる)
  • 一時的に NULL を許可していたカラムの NULL 許可をやめる

さいごに

  • 移行中は一時的にカラムの NULL を許可しないといけないものがあったことに後から気づいて大変だった
  • 移行スクリプトもテストを書いていたので安心できた
  • 移行手順書を書いてたので安心できた、事前準備は大事