6
3

More than 5 years have passed since last update.

Rails vs PostgreSQL カラムをstringからintegerに変更できない

Posted at

バージョン情報

  • Ruby: 2.5.0
  • Rails: 5.1.6
  • Postgres: 11.1
  • macOS: 10.14.1

事象

usersテーブルのgenderカラムをstringからintegerに変えるため、以下のコマンドでマイグレーションファイルを作成し、

bin/rails g migration change_gender_datatype_to_integer_in_users

作成されたマイグレーションファイルに以下のように記載した後、

2019mmddhhmmss_change_gender_datatype_to_integer_in_users.rb
class ChangeGendersDatatypeInUsers < ActiveRecord::Migration[5.1]
  def change
    change_column :users, :gender, :integer
  end
end

マイグレーションを実行すると、

bin/rails db:migrate

以下のエラーが表示されました。

rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:

PG::DatatypeMismatch: ERROR:  default for column "gender" cannot be cast automatically to type integer

ググってみると、同様のエラーに遭遇している先人たちがおりましたので参考にしましたが、いずれの方法でも回避することはできず。。。

https://qiita.com/gam0022/items/a73910de5b8eb44e5b13
https://stackoverflow.com/questions/12603498/rails-migration-error-w-postgres-when-pushing-to-heroku
https://dzone.com/articles/rails-5-change-database-column

解決方法

一度該当カラムをremoveして、再度追加することで対応しました。

一度ドロップして、

remove_column :users, :gender

ドロップできたら新しいマイグレーションファイルを作成して、add_columnしてあげます。

add_column :users, :gender, :integer, after: :phone, default: 0

すると追加できました!が、なぜかafterが機能しておらず、末尾に追加されてしまいました。

schema.rb

    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "gender", default: 0

解決したら更新します。

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3