railsアプリを修正中、カラム属性を間違えて「integer」とすべきところを「string」で定義してしまいました。属性を変更できるということで、気軽に「change_column」しようとしたら、
PG::DatatypeMismatch: ERROR: column "column_name" cannot be cast automatically to type integer
というエラーが出てハマりました。
前提
railsアプリをPostgreSQLを用いて開発しています。カラム属性を間違えて定義してしまっていたので、属性を変更しようとしました。
経緯
まずは、空のマイグレーションファイルを作りました。
$ rails g migration change_data_BBBBB_to_AAAAA
「AAAAA」がテーブル名「BBBBB」がカラム名です。
出来上がったマイグレーションファイルを、下記のように記述しました。
def change
change_column :AAAAA, :BBBBB, :integer
end
変更後
$ rails db:migrate
を実行すると
PG::DatatypeMismatch: ERROR: column "BBBBB" cannot be cast automatically to type integer
というエラーで強制終了となりました。
原因
どうやら PostgreSQL の場合は、「change_column」の記述方法がちょっと違うようでした。
対策
def change
change_column :AAAAA, :BBBBB, 'integer USING CAST(BBBBB AS integer)'
end
「USING CAST」句を付け加えて定義してあげる必要があるようです。
まとめ
ハマると二日三日は平気で進まなくなってしまうので、自分用に備忘録として残しておきます。
コメント