#概要
アウトプット用に、学習した内容を紹介していきます。
本日はActiveRecordを用いて、タブ区切りtsvファイルのデータをローカルデータベースにあるテーブルに登録してみます。
#環境
Mac OS Mojave 10.14.6
Ruby 2.5.3
MySQL 5.7.28
ActiveRecord 6.0.1
#テーブル
以下のタブ区切りtsvで保存された表を、ActiveRecordでローカルデータベース内のテーブルに保存する事を考えます。
user_id content
1 Hello
1 World
2 I'm Paul.
4 😀
5 😂
最終的に以下の形でDBに登録されて欲しいです。
postsテーブル
id | user_id | content |
---|---|---|
1 | 1 | Hello |
2 | 1 | World |
3 | 2 | I'm Paul. |
4 | 4 | 😀 |
5 | 5 | 😂 |
#登録の流れ
それではまずtrainingというデータベースにpostsテーブルを作成します。
use training;
でデータベースを選択しておきます。
また登録データに絵文字があるので、ALTER DATABASE training CHARACTER SET utf8mb4;
などであらかじめ文字コードを変更しておきましょう。
postsテーブルを作成するのは以下のコードで作成します。
mysql> create table posts
-> (id int auto_increment not null primary key,user_id int,content text);
Query OK, 0 rows affected (0.01 sec)
idをauto_increment(自動的に番号を割り当て)のNULLを許さない主キーに設定し、user_idをint型、contentをtext型に設定します。
念の為テーブルを以下のコマンドで確認しておきます。
mysql> show columns from posts;
+---------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+---------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| user_id | int(11) | YES | | NULL | |
| content | text | YES | | NULL | |
+---------+---------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
mysql> select * from posts;
Empty set (0.00 sec)
無事設定したカラムで空のテーブルが作成されています。
それではここに、ActiveRecordを用いて先ほどのtsvデータを登録してみましょう。
require 'active_record'
FILE_PATH = './posts.txt'
# DB接続
ActiveRecord::Base.establish_connection(
adapter: 'mysql2',
host: 'localhost',
username: 'root',
password: 'password',
database: 'training',
encoding: 'utf8mb4'
)
# Postクラスーpostsテーブルの対応
class Post < ActiveRecord::Base
end
# posts.txtを開く
file = File.open(FILE_PATH)
# 一行目はカラム名なので飛ばす
file.readline
# 一行ずつpostsに追加
file.each do |line|
post = line.chomp.split("\t")
Post.create(
user_id: post[0],
content: post[1]
)
end
#DB接続
の部分が、DBに接続するための呪文です。
そこから下でActiveRecord::Baseクラスを継承したPostクラスを用意しています。これでActiveRecord::Baseを継承したPostのクラスメソッドを通じてpostsテーブルへアクセスできるようになります。命名規則に従っているため、postsというテーブル名がコードに出てくることなくpostsテーブルへのレコードが登録できます。
そこから下は、postsテーブルにデータを追加していくコードです。
ちなみにrequire 'CSV'
しておくと、
table = CSV.table(FILE_PATH, col_sep: "\t")
table.each do |line|
Post.create(line.to_hash)
end
といったスッキリしたコードで書くことができます。
それでは実行してみましょう。
$ ruby regist_to_posts.rb
ターミナルには何も出力されませんが、テーブルには書き込まれています。
コード中にActiveRecord::Base.logger = Logger.new(STDERR)
を記述しておくとログが見れるのでおすすめです。
本当に登録できているのかテーブルを確認しに行きます。
mysql> select * from posts;
+----+---------+-----------+
| id | user_id | content |
+----+---------+-----------+
| 1 | 1 | Hello |
| 2 | 1 | World |
| 3 | 2 | I'm Paul. |
| 4 | 4 | 😀 |
| 5 | 5 | 😂 |
+----+---------+-----------+
5 rows in set (0.00 sec)
無事に登録できたようです。