カラムの属性を変更すると「PG::DatatypeMismatch: ERROR」というエラーになる

Ruby on Rails

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」句を付け加えて定義してあげる必要があるようです。

まとめ

ハマると二日三日は平気で進まなくなってしまうので、自分用に備忘録として残しておきます。

コメント