Railsでbigint(20) やtinyint(4)を使う時のマイグレーションファイルの編集方法

f:id:daikiyano:20190326211651p:plain

本記事ではRailsでbigint(20) やtinyint(4)を使う時のマイグレーションファイルの編集方法についてご紹介します。

railsのデフォルトはint型

普段railsを触っているとマイグレーションファイルで簡単にデータベース(DB)周りを操作できてしまうので、意識しないとDB周辺の知識を深める機会がありません。

  • マイグレーションファイル・・・active recordを介してDBを操作するファイルのこと。

例えば,Userテーブルで年齢のデータを扱うためにageというカラム名を作成する場合、

rails g model User age:integer

をコマンド上で実行すると以下のようなマイグレーションファイルが生成されます。

class CreateUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :users do |t|
     t.integer :age
     t.timestamps
    end
  end
end

ファイルの内容を確認しrails db:migrateを実行するとint(11)型が生成されます。では、これをbigint(20) やtinyint(4)に変更するにはどうすればいいのか紹介していきましょう。

MySQLで設定可能なデータ型

数値型の中の整数型だと以下の五つが基本的に用意されています。

TINYINT

-128から127 (符号無しの場合0から255)

SMALLINT

-32768から32767 (符号無しの場合0から65535)

MEDIUMINT

-8388608から8388607 (符号無しの場合0から16777215)

INT

-2147483648から2147483647 (符号無しの場合0から4294967295)
別名:INTEGER

BIGINT

-9223372036854775808から9223372036854775807
(符号無しの場合0から18446744073709551615)

データ型を意識する理由

データ型を意識しなければならない理由としてデータベースのパフォーマンス向上させるためです。intではなくtinyintを使用するのは、データベースの容量を節約させるためであり、全ての値を確実に含めることができる最小のデータ型を使用します。例えば、先ほど年齢のデータ用にageカラムを作成しました。しかし、255歳を超えて生きる人は現代の人類ではありえません。そのように考えた時に人の年齢をDBで扱う場合、型はtinyintで十分です。逆にFacebookのような大企業がアカウントを管理する時はint型では足りない可能性があるので、bigint型を使用する必要があります。このようにDBのパフォーマンスを向上させるためにデータ型を意識する必要があります。

railsのマイグレーションファイルでbigintやtinyintに設定する方法

tinyintを例に見ていくと、
tinyintを設定する方法は非常に簡単でマイグレーションファイルでlimitを記述してあげるだけです。

class CreateUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :users do |t|
     # limit: 1を追加
      t.integer :age, limit: 1
      t.timestamps
    end
  end
end

limit: 1を付け加えた後にrails db:migrateを実行し、DBを確認すると型がtinyintに変更されているのを確認できます。

Field    | Type             | Null | Key | Default | Extra          |
+----------+------------------+------+-----+---------+----------------+
| age | tinyint(4)       | YES  |     | NULL    |                |

確認としてlimit1〜8をそれぞれ記述しmigrate実行後、DBを確認するとtinyからbigintまでそれぞれ変更することができます。

class IntegerTests < ActiveRecord::Migration
  def change
    create_table :integer_tests do |t|
     t.integer :integer1, limit: 1
     t.integer :integer2, limit: 2
     t.integer :integer3, limit: 3
     t.integer :integer4, limit: 4
     t.integer :integer5, limit: 5
     t.integer :integer6, limit: 6
     t.integer :integer7, limit: 7
     t.integer :integer8, limit: 8
    end
  end
end 
+----------+------------------+------+-----+---------+----------------+
| Field    | Type             | Null | Key | Default | Extra          |
+----------+------------------+------+-----+---------+----------------+
| integer1 | tinyint(4)       | YES  |     | NULL    |                |
| integer2 | smallint(6)      | YES  |     | NULL    |                |
| integer3 | mediumint(9)     | YES  |     | NULL    |                |
| integer4 | int(11)          | YES  |     | NULL    |                |
| integer5 | bigint(20)       | YES  |     | NULL    |                |
| integer6 | bigint(20)       | YES  |     | NULL    |                |
| integer7 | bigint(20)       | YES  |     | NULL    |                |
| integer8 | bigint(20)       | YES  |     | NULL    |                |
+----------+------------------+------+-----+---------+----------------+

railsを学習されている方はマイグレーションファイルに頼るだけでなく、MySQLなどを直接操作して見たりして知見を深めるとPHPなど他言語を扱う際に役に立ってくるのではないでしょうか。

Rails初心者で独学でつまづいているという方はこちらも参考にしてみてください。

関連記事

【プログラミング初心者向け】UdemyのRubyおすすめコースまとめ
【プログラミング初心者向け】独学で習得するRuby on Railsの学習手順について
【初心者向け】プログラミングが難しいと感じる理由と挫折しない方法

参考サイト

qiita.com

>文系エンジニア大学生の技術ブログ

文系エンジニア大学生の技術ブログ

社会が多様化していく中、大学生の学生生活も多様であるべきと考えています。主にエンジニア向けにITやプログラミングなどの技術系と大学生向けに休学、留学、海外生活、トビタテ留学、長期インターンに関する記事を書いています。