rails カラムのデータ型を「integer」に変更しようとすると「PG::DatatypeMismatch: ERROR: column “column_XX” cannot be cast automatically to type integer」でエラーになる

Ruby on Rails

「rails」& 「PostgreSQL」 でシステムを構築しています。カラムのデータ型を間違って登録していたので変更しようとすると、エラーになりました。
原因はわかりませんが、対処法がわかったので備忘録として残しておきます。  

データ型を「string」から「integer」に変更する

「Order」テーブルの「column_XX」のデータ型を変更します。
まず、migrationファイルを作ります。

⇒ rails g migration ChangeData<変更するカラム名>To<テーブル名> <カラム名:型>

rails g migration ChangeData_column_XX_to_orders column_XX:integer

実行すると、下記のようなmigrationファイルができます。

class ChangeDataColumnXxToOrders < ActiveRecord::Migration
  def change
  end
end

ここに、変更したいカラムとデータ型を追加で記述します。
今回は「Order」テーブルの「column_XX」のデータ型を「integer」に変更します。

class ChangeDataColumnXxToOrders < ActiveRecord::Migration
  def change
   change_column :orders, :column_XX, :integer
  end
end

保存して、migrationを実行します。

rails db:migrate

うまくいくはずが、エラーとなりました。

エラー発生

PG::DatatypeMismatch: ERROR:  column "column_XX" cannot be cast automatically to type integer

こんな感じでエラーが発生。意味がわかりません。

対処法

意味がわかりませんが、下記のように記述を変更するとうまくいきました。

class ChangeDataColumnXxToOrders < ActiveRecord::Migration
  def change
   change_column :orders, :column_XX, 'integer USING CAST(column_XX AS integer)'
  end
end

まとめ

よくわかりませんが、うまくいったのでよしとします。

コメント