🐥

カラム追加・削除・編集方法

2024/03/12に公開

はじめに

カラム周辺のコマンドをすぐ忘てしまうので、まとめてみました

カラム追加

$ rails g migration Addカラム名Toテーブル名 カラム名:型名
  • 具体的な書き方

「books」テーブルに文字列型の「title」というカラムを追加したい場合は、以下のようになります。

$ rails g migration AddTitleToBooks title:string
$ rails db:migrate

「rails db:migrate」: データベースの構造(テーブル、カラム)を変更するときに利用するコマンド

カラム削除

$ rails g migration Removeカラム名Fromテーブル名 カラム名:型名
  • 具体的な書き方

「books」テーブルに文字列型の「title」というカラムを削除したい場合は、以下のようになります。

$ rails g migration RemoveTitleFromBooks title:string
$ rails db:migrate

## ※データベース変更前の注意点
カラムを変更する際はデータベースを変更するので、簡単には変更できないようになっている。
ここの手順も間違えがちで、かつ間違えると厄介なところです。

$ rails db:migrate:status

上記のコマンドを実行すると下記の表記が出ます。

下記の表記でこれまでに作られたmigrationファイルがdb:migrateされたかどうかがわかります。

down → db:migrate実行前、up → db:migrate実行後

Status   Migration ID    Migration Name
--------------------------------------------------
   up     20220403064432  Devise create users
  down    20220403131323  Add name to users

一番大事なことが、データベースを変更する場合は、migrationファイルがdown状態かどうかを確認してから、変更しなければなりません。

データベースのステータスをupからdownにする方法

  • rails db:migrate実行直後の場合
$ rails db:rollback

上記が1つ前の状態に戻すコマンドです。先ほど確認したStatusがdownになるので、そのファイルを削除や変更することができるようになります。

  • rails db:migrate実行直後出ない場合
$ rails db:migrate:down VERSION=Migration ID

上記でMigration ID で指定したもののみdownにすることができます!
Migration IDは$rails db:migrate:statusで確認できます。

migrationファイルはデータベースに関するものなので扱いには気をつけなければエラーを起こしやすいので、慎重にするべきです!!

## カラム名の変更(修正)について

migrationファイルを作成

データベースに反映済みのマイグレーションファイル直接修正

$ rails g migration rename_変更したいカラム名_column_to_テーブル名
(例) $ rails g migration rename_title_column_to_books

上記のコマンドで下記のファイルが作成されるので、そのファイルを編集します。

db/migrate/20XXXXXXXXXXX_rename_title_column_to_posts
class RenameRequestColumnToJobAdministrations < ActiveRecord::Migration[5.0]
  def change
    rename_column :posts, :title, :comment
  end
end

最後に

$ rails db:migrate

でデータベースに反映させます。

データ型の変更

$ rails g migration ChangeDatatypeカラム名Ofテーブル名
(例) $ rails g migration ChangeDatatypeCommentOfPosts

カラム名、テーブル名は大文字なので気をつけてください!

生成されたファイルを編集します。

class ChangeDatatypeUseIdOfBlogs < ActiveRecord::Migration[5.0]
  def change
    change_column :posts, :comment, :text
  end
end

最後に

& rails db:migrate

でデータベースに反映させます。


参考:
https://qiita.com/iverson3kobe0824/items/6dfce930d57dcc5dd482
https://qiita.com/2016asap/items/2e45926bc49ced865970

GitHubで編集を提案

Discussion