LoginSignup
1
0

More than 3 years have passed since last update.

【ActiveRecord】タブ区切りtsvをデータベーステーブルに登録する

Last updated at Posted at 2019-11-12

概要

アウトプット用に、学習した内容を紹介していきます。
本日はActiveRecordを用いて、タブ区切りtsvファイルのデータをローカルデータベースにあるテーブルに登録してみます。

環境

Mac OS Mojave 10.14.6
Ruby 2.5.3
MySQL 5.7.28
ActiveRecord 6.0.1

テーブル

以下のタブ区切りtsvで保存された表を、ActiveRecordでローカルデータベース内のテーブルに保存する事を考えます。

posts.txt
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データを登録してみましょう。

regist_to_posts.rb
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)

無事に登録できたようです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0