「ActiveRecordを単体で使うには」をやっている最中に手間取ったので記録しておきます。初心者ですので間違っていることがあれば教えて頂けると幸いです。
#目次
-
gem install mysql2のエラーの対処法
-
Can't initialize character set utf8
実行環境
Ubuntu 18.04
WSL1
Ruby2.7.2
ActiveRecord 6.1.4 (バージョン確認方法: gem list | grep activerecord)
#1. gem install mysql2のエラーの対処法
サイトに書いてある通り、gem install mysql2を実行すると以下のエラーが出てしまいます。
Building native extensions. This could take a while...
ERROR: Error installing mysql2:
ERROR: Failed to build gem native extension.
/home/your username/.rbenv/versions/1.9.3-p286/bin/ruby extconf.rb
サイトに出ているエラーの対処法はRed Hat系のLinuxディストリビューション用です。これはyumを使っていることからわかります。
$ sudo yum info mysql-devel
Ubuntuではaptを使います。そのうえ、Ubuntuではmysql-develというものは存在しないので、libmysqlclient-devとlibmysqld-devをそれぞれインストールしましょう。
$ sudo apt install libmysqlclient-dev && libmysqld-dev
これを実行した後に、gem install mysql2をすると無事にmysql2をインストールすることが出来ました。
確認用コマンド
$ gem list | grep mysql2
mysql2 (0.5.3)
#2. Can't initialize character set utf8 (path: /usr/share/mysql/charsets/)
このエラーは実際にターミナルでrubyファイルを実行しようとしたときに出てきたエラーです。実行しようとしたファイルのソースコードは以下の通りです。
require 'active_record'
ActiveRecord::Base.establish_connection(
adapter: "mysql2",
host: "localhost",
username: "admin",
password: "charo1yuya",
database: "training",
)
class User < ActiveRecord::Base
self.table_name = 'users'
end
p User.all
これを実行したらこんなエラー出てきました。(......はTracebackなので割愛)
Character set 'utf8' is not a compiled character set and is not specified in the
'/usr/share/mysql/charsets/Index.xml' file
......
: Can't initialize character set utf8 (path: /usr/share/mysql/charsets/) (Mysql2::Error)
26: from training_57.rb:17:in `<main>'
25: from training_57.rb:17:in `p'
......
Can't initialize character set utf8 (path: /usr/share/mysql/charsets/)
(ActiveRecord::ConnectionNotEstablished)
これはutf8がコンパイルされた文字セットでないことと、Index.xmlに存在しないことからエラーでているということでした。Index.xmlを確認したところ、utf8はやはり存在してなく、その代わりにutf8mb3になっていました。
###原因と解決策
この原因としてはRubyファイルから接続する際にエンコーディングの指定をしていなかったことが原因でした。デフォルトではエンコーディングはutf8でそれを変える必要がありました。
require 'active_record'
ActiveRecord::Base.establish_connection(
adapter: "mysql2",
host: "localhost",
username: "admin",
password: "charo1yuya",
database: "training",
charset: "utf8mb4",
encoding: "utf8mb4",#これ!
)
class User < ActiveRecord::Base
self.table_name = 'users'
end
p User.all
establish_connection内のencodingにutf8mb4を追加したところ、無事にファイルを実行することが出来ました。
この理由として考えられるのはDBのエンコーディングの設定もあらかじめutf8mb4に設定してあったためだと思います。utf8mb4になっていない場合は「mariadb 文字コードをutf8からutf8mb4へ」で変更しましょう。これを確認するにはDBに接続した後以下のコマンドを入力します。
MariaDB [(none)]> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8mb3 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.001 sec)
しっかりと確認したら、いよいよ実行です。以下が実行結果になります。
$ ruby training_57.rb
#<ActiveRecord::Relation [#<User id: 1, name: "Taro", gender: "m", age: 20>, #<User id:
2, name: "john", gender: "m", age: 18>, #<User id: 3, name: "paul", gender: "m", age:
20>, #<User id: 4, name: "alice", gender: "f", age: 15>, #<User id: 5, name: "dabid",
gender: "m", age: 17>, #<User id: 6, name: "jasmin", gender: "f", age: 17>]>
※userテーブルの中身
+----+--------+--------+------+
| id | name | gender | age |
+----+--------+--------+------+
| 1 | Taro | m | 20 |
| 2 | john | m | 18 |
| 3 | paul | m | 20 |
| 4 | alice | f | 15 |
| 5 | dabid | m | 17 |
| 6 | jasmin | f | 17 |
+----+--------+--------+------+