はじめに
この記事では、MySQLを使ってテーブルを作るところから、Rubyスクリプトでサンプルデータをデータベースに追加するところまでを紹介します。
ちなみに環境はこんな感じです。
$ mysql --version
mysql Ver 14.14 Distrib 5.7.18, for osx10.12 (x86_64) using EditLine wrapper
作りたいテーブルはこんな感じ。
データベース名:chatroom
テーブル名:users
カラム名 | 内容 |
---|---|
user_id | int, unsigned, not null |
name | varchar(20), not null |
password | char(64), not null |
prefectures | varchar(20), not null |
追加したいサンプルデータはこんな感じ。
user_id | name | password | prefectures |
---|---|---|---|
1 | shinichi | hoge | gunma |
2 | ran | fuga | saitama |
3 | sonoko | fizz | ibaraki |
4 | kogoro | buzz | tokyo |
5 | ai | ping | kyoto |
まずは、MySQLでテーブルを作ろう
MySQLに接続
$ mysql -uroot
データベース作成
mysql> create database if not exists chatroom;
データベースが作成できたか確認
mysql> show databases;
データベースへ接続
mysql> use chatroom;
テーブル作成
mysql> create table users (
-> user_id int unsigned not null,
-> name varchar(20) not null,
-> password char(64) not null,
-> prefectures varchar(256) not null
-> )engine = InnoDB;
プライマリーキー設定
mysql> alter table users add primary key (user_id);
テーブルが作成できたか確認
mysql> show tables;
カラムの内容を確認
mysql> show columns from users;
つづいて、サンプルデータを追加していこう
ruby-mysqlを導入
$ sudo gem install ruby-mysql
Rubyスクリプトを書く
sampledata.rb
require 'mysql' #ruby-mysql
require 'digest/sha1' #passwordをSHA1でハッシュ化するために必要
# サンプルデータ
names = ['shinichi','ran','sonoko','kogoro','ai']
passwords = ['hoge','fuga','fizz','buzz','ping']
prefectures = ['gunma','saitama','ibaraki','tokyo','kyoto']
# MySQLに接続
client = Mysql.connect("127.0.0.1","root","","chatroom")
#引数:(ホスト名/IPアドレス(127.0.0.1→localhost), ユーザー名, パスワード(最初は設定されてない), データベース名)
# INSERT文
# ここでは値が入る部分を?で設定する
query = client.prepare('insert into users values (?,?,?,?)')
range = 0..4 #4:追加したいデータ数-1
range.each do |num|
# ここINSERTしたい値を実際に指定している
query.execute num+1, names[num], Digest::SHA1.hexdigest(passwords[num]), prefectures[num]
# Digest::SHA1.hexdigest() → 値をSHA1でハッシュ化する関数
# 今回はpasswordをハッシュ化してからDBに入れています
end
スクリプトを実行
$ ruby sampledata.rb
サンプルデータが追加されたか確認
mysql> select * from users;
まとめ
多くのサンプルデータを毎回SQL文で打ち込むのは大変です。スクリプトを使えばだいぶ効率化すると思います。