本記事では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の学習手順について
【初心者向け】プログラミングが難しいと感じる理由と挫折しない方法