ridgepoleでテーブル名・カラム名の変更手順

ridgepoleはスキーマ定義ファイルの設定をそのままRDBMSに反映できるツールです( ridgepoleのメリットと使い方参照)。
運用中のテーブル名やカラム名をリネームしたい場合には注意が必要です。

カラム名変更のケースでは設定ファイル中の列名を単に書き換えると、旧名のカラム削除&新名称のカラム作成という挙動になり、旧名で保持していた既存のカラムデータが消えます。

期待している列名変更のための方法は、renamed_fromオプションを指定することです。

create_table "articles", force: :cascade do |t|
  t.text     "desc", renamed_from: "text"
end

蛇足ですがrenamed_fromオプションで追記している部分が旧名で、text→descの変更例です。

なお、この構成ファイルをDBに適用してDB上の列名が新しい名前に変わったらrenamed_fromオプションをトルツメしても問題ありません。
たとえば再々変更を行いたい場合には、renamed_fromにDB上の現行名称(上のケースではdesc)を指定すれば名称変更動作になります。

カラム名移行のオペレーションは、(1)ターゲットのDBすべてに変更を適用&確認し、(2)renamed_fromを消したうえで(3)再度ridgepole -aで挙動確認する、段階まで集中的に実行しきって過渡的な状態を残さない方が安全かもしれません。

また、ridgepole外の手順になりますが、SQLで直接ALTER TABLE発行し、変更後のカラム名をridgepoleの構成ファイルに記載する(renamed_fromオプションを使わない)という手順でもカラムデータを失わずに変更できます。

構成ファイル上の名称とDB上の名称が一致している状態であればridgepoleからDDL発行が起きない、名称が違っている状態の基本挙動は削除&作成という挙動を把握しておくと良いでしょう。
なお、テーブル変更の際も同様にrenamed_fromオプションが利用できます。

⁋ 2018/01/25↻ 2024/11/07
中馬崇尋
Chuma Takahiro