はじめに
本記事はドットインストールActive Record入門 (全19回)で学習する内容をMySQLを用いて再現した時のメモ書きである。(ドットインストールではSQLite3を用いていた)
そのため、SQLite3とMYSQLの実装時における差分を中心に掲載。
対象読者
ActiveRecordを勉強しようと思い、ドットインストールの該当教材を開くも、MySQLでなくSQLite3での実装だったため、ちょっとがっかりしてしまった人(どんだけ母数少ないんや)
本記事の目的
ドットインストールActive Record入門 (全19回)をMySQLを使っても履修し始められるソースコードと情報の提供
実行環境
バージョン | Extra | |
---|---|---|
CentOS | 6.9 | VirtualBox経由でssh接続 |
VirtualBox | 5.1.18 | |
ActiveRecord | 5.1.0 | |
MySQL | 5.7.18 | |
Ruby | 2.4.1 | rbenvで管理 |
Bundler | 1.14.6 |
Gemfileの作成とインストール
Bundlerを用いたgemのバージョン管理の練習もしたかったため、使用するgemファイルを管理するファイルをカレントディレクトリに作る。
\# ひな形ファイルの作成
$ bundle init
Writing new Gemfile to /home/u1/hoge/Gemfile
\# 編集
$ vim Gemfile
source "https://rubygems.org"
gem "activerecord"
gem "mysql2"
gem "sinatra"
\# 必要なGemのインストール
$ bundle install --path vendor/bundle
データベースの準備
ドットインストールでは第2回の内容に相当。
インポートするsqlファイルを準備。
create database if not exists TestApp;
use TestApp;
create table users(
id int(5) primary key auto_increment,
name varchar(50),
age int(5),
created_at timestamp not null default current_timestamp,
updated_at timestamp not null default current_timestamp on update current_timestamp
)
auto_increment = 1;
MySQLと SQLite3の相違点
- 自分で調べた限りによると、MySQLではcreated_atとupdated_atは自動でデータ型が適用されず、以上のように設定する必要があるらしい。この設定は MySQL5.6で作成日時と更新日時を自動で設定してみる を参考にした。このブログにも書かれているが、MySQLのバージョンが古いと、
ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause
というエラーが出る。
- auto_incrementもデフォルトでは設定されないので、設定する必要がある。もしくは、データをinsertする際にidも追加で付与するか。
レコードの挿入
ドットインストールでは第3、4回の内容に相当。
後々の便利のために、データベースに関する設定情報を「database.yml」という名前のYAML形式ファイルをカレントディレクトリに作成。
development:
adapter: mysql2
database: TestApp
host: localhost
username: root
password: ××××××××
encoding: utf8
このymlファイルを読み込む形でmain.rbを作成。
databaseの読み込みとコンフィグレーションの2行の記述方法に関しては
Sinatra+ActiveRecord+MySQLで、簡単APIサーバ構築 -Qiita
Sinatra+ActiveRecord+SQLite3で,軽量なWeb-DB連携例
を参考にした。
require 'active_record'
require 'pp'
require 'mysql2'
Time.zone_default = Time.find_zone! 'Tokyo'
ActiveRecord::Base.default_timezone = :local
ActiveRecord::Base.configurations = YAML.load_file('database.yml')
ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['development'])
class User < ActiveRecord::Base
end
# insert
user = User.new
user.name = "tanaka"
user.age = 23
user.save
# user = User.new(:name => "hayashi", :age => 25)
user = User.new(name: "hayashi", age: 25)
user.save
User.create(name: "hoshi", age: 22)
このmain.rbを、
bundle exec ruby main.rb
で実行すると、エラーなく通った。
MySQLで
use TestApp;
select * from users;
を打って確認すると、
+----+---------+------+---------------------+---------------------+
| id | name | age | created_at | updated_at |
+----+---------+------+---------------------+---------------------+
| 1 | tanaka | 23 | 2017-05-08 14:11:00 | 2017-05-08 14:11:00 |
| 2 | hayashi | 25 | 2017-05-08 14:11:00 | 2017-05-08 14:11:00 |
| 3 | hoshi | 22 | 2017-05-08 14:11:00 | 2017-05-08 14:11:00 |
+----+---------+------+---------------------+---------------------+
3 rows in set (0.00 sec)
と正しくレコードが挿入されていることがわかる。ちなみにここで、
update users set name = 'toyama' where id = 1;
と、あるレコードの値を更新してみると、
mysql> select * from users;
+----+---------+------+---------------------+---------------------+
| id | name | age | created_at | updated_at |
+----+---------+------+---------------------+---------------------+
| 1 | toyama | 23 | 2017-05-08 14:11:00 | 2017-05-08 14:39:55 |
| 2 | hayashi | 25 | 2017-05-08 14:11:00 | 2017-05-08 14:11:00 |
| 3 | hoshi | 22 | 2017-05-08 14:11:00 | 2017-05-08 14:11:00 |
+----+---------+------+---------------------+---------------------+
3 rows in set (0.00 sec)
となり、created_atもupdated_atも正しく機能していることがわかる。
これ以降の教材動画は、MySQLでもSQLite3でも全く操作は変わらない。
終わりに
せっかく良い教材なので、MySQLを使って学びたい初心者の方の一助となれば幸いである。