はじめに
メディレコ は三年くらい前に FJORD BOOT CAMP の最終課題で作った Web アプリ。詳しくはこちらの記事にかいているけど、今読むとちょっとけっこうかなりとても恥ずかしい。自分のために作ったアプリだったが、両親も割と使ってくれていて、バグの報告をしてくれるので助かっている。
当時はテーブル設計について特に考えていなかったが、最近になって見てみるとテーブルに分離したほうが良さそうなカラムに気づいたので、新しいテーブルの作成・移行・カラムの削除を行った。
テーブル
変更前のスキーマ (一部省略)
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 のバックアップ
- ローカルでデータを持ちたくなかったので heroku のバックアップを使った
- Heroku PGBackups | Heroku Dev Center
- テーブル作成のコードのデプロイ
- seed データを流す
- 移行対象数を数えるスクリプトを流す
- 移行スクリプトを実行する
- 移行対象数を数えるスクリプトを流す (0 になっていたら完了)
- DB のバックアップ
3. 後片付け
- カラムの削除 (
medical_bills.classification
) - アソシエーションの修正 (
medical_bills._classification
のアンスコをやめる) - 一時的に NULL を許可していたカラムの NULL 許可をやめる
さいごに
- 移行中は一時的にカラムの NULL を許可しないといけないものがあったことに後から気づいて大変だった
- 移行スクリプトもテストを書いていたので安心できた
- 移行手順書を書いてたので安心できた、事前準備は大事