- 更新日: 2013年12月15日
- Rails
Rails のマイグレーションで、DBテーブルのカラムのオプションを変更する
null: false, default: “” のオプションが付いている、DBテーブルのカラムを「NULL値を許可、default値をNULL」に変更します。users テーブルの provider カラムのオプションを、「NULL値:許可しない、default値:””」から「NULL値:許可、default値:NULL」に変更したいと思います。
up/down メソッドを定義してマイグレーション作成
いったんDBをリセットして、テーブルのテスト用のレコードを削除します。テスト用レコードが残っているとマイグレートでエラーが起きる可能性があるため。development 環境です。
1 2 3 |
$ bundle exec rake db:reset |
マイグレーション作成。
1 2 3 |
$ bundle exec rails generate migration ChangeProviderOptionsToUsers provider |
db/migrate/***_change_provider_options_to_users.rb
1 2 3 4 5 6 7 8 9 |
class ChangeProviderOptionsToUsers < ActiveRecord::Migration def up change_column :users, :provider, :string, null: true, default: nil end def down change_column :users, :provider, :string, null: false, default: "" end end |
rake db:rollback で1つ前の状態に戻せるように、up と down を各々明示的に定義します。
マイグレート実行。
1 2 3 |
$ bundle exec rake db:migrate |
データベースのテーブル構造を確認
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
mysql> desc users; +------------------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | email | varchar(255) | NO | UNI | | | | encrypted_password | varchar(255) | NO | | | | | reset_password_token | varchar(255) | YES | UNI | NULL | | | reset_password_sent_at | datetime | YES | | NULL | | | remember_created_at | datetime | YES | | NULL | | | sign_in_count | int(11) | NO | | 0 | | | current_sign_in_at | datetime | YES | | NULL | | | last_sign_in_at | datetime | YES | | NULL | | | current_sign_in_ip | varchar(255) | YES | | NULL | | | last_sign_in_ip | varchar(255) | YES | | NULL | | | created_at | datetime | YES | | NULL | | | updated_at | datetime | YES | | NULL | | | uid | varchar(255) | NO | MUL | | | | provider | varchar(255) | YES | | NULL | | | name | varchar(255) | NO | | | | +------------------------+--------------+------+-----+---------+----------------+ 16 rows in set (0.01 sec) |
以上、provider カラムのオプションを変更できました。
【追記 2013/12/18】
この作業を行ったあとで考えたのですけど、uid と provider の複合インデックスにユニークキー制約を付けているので、provider に NULL 許可するのはまずいかもしれません。というのも、通常の単一でのインデックス作成にユニークキー成約した場合、MySQL はユニーク制約として NULL を無視するから。
Devise の reset_password_token カラムを見て、MySQL のユニークキーが NULL 重複を許可するのを思い出した | EasyRamble
調査して、複合インデックスの場合でも、ユニーク制約として NULL が無視されるのであれば、このマイグレーションは適用するべきではありません。その場合は、DBを元に戻してマイグレーションファイルを破棄する。
1 2 3 4 |
$ bundle exec rake db:rollback $ bundle exec rails destroy migration ChangeProviderOptionsToUsers |
まあカラムのオプションを変更する方法を確認できたので良かったです。
- Rails の関連記事
- RailsでMySQLパーティショニングのマイグレーション
- Rails ActiveRecordでdatetime型カラムのGROUP BY集計にタイムゾーンを考慮する
- RailsプラグインGemの作成方法、RSpecテストまで含めたrails pluginの作り方
- RailsでAMPに対応するgemをリリースしました
- Railsでrequest.urlとrequest.original_urlの違い
- Railsでwheneverによるcronバッチ処理
- Google AnalyticsのRails Turbolinks対応
- Railsアプリにソーシャル・シェアボタンを簡単設置
- Rails監視ツール用にErrbitをHerokuで運用
- Facebook APIバージョンのアップグレード手順(Rails OmniAuth)
Leave Your Message!