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など他言語を扱う際に役に立ってくるのではないでしょうか。

www.for-engineer.life

www.for-engineer.life

www.for-engineer.life

www.for-engineer.life

参考サイト

https://www.dbonline.jp/mysql/type/index1.html

qiita.com

最新情報をチェックしよう!
>文系エンジニア大学生の技術ブログ

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

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