rakeとシェルスクリプトを使って、複数DBへのデータインポートを効率化する

初めまして、kouです！
いつもは社内アカウントでqiitaを書いているのですが、今回は気分転換に個人アカウントで記事を書いていきたいと思います！

## 座学編

### rakeとは？
rubyで使用されるタスクランナーの一種。
実行したい処理をrubyで書いてタスクとして登録し、登録したタスクをrakeコマンドで実行する。
→ 一旦rakeタスクに登録しておけば、コマンドを入力するだけで処理を実行してくれるのでかなり便利！

### シェルスクリプトとは？
> シェルスクリプトとは、シェルによって解釈・実行される一連の処理を記述したスクリプト。狭義では、Unixシェルで用いられるスクリプト言語を指します。
「スクリプト(script)」は「台本」という意味で、コンピュータに実行させたい処理を記述してコンピュータを動かせます。
この台本をテキストデータで用意したものがシェルスクリプトです。コマンド・インタプリタとも呼ばれています。
ref: https://udemy.benesse.co.jp/development/system/shellscript.html

→ エクセルのマクロみたいに、一連の動作を自動化できる。

## 実践編
例：ユーザーデータと記事データを同時にDBに登録する。

### rakeタスクの登録方法

#### rakeタスク登録用のファイル作成
```
rails g task import_user
rails g task import_article
or
touch lib/tasks/import_user.rake
touch lib/tasks/import_article.rake
```

#### rakeタスクの追加

##### userデータ用
```lib/tasks/import_user.rake
namespace :import_user do
  USERS = [
    { name: "佐藤", email: "poyopoyo@gmail.com" },
    { name: "田中", email: "fugafuga@gmail.com" },
    { name: "鈴木", email: "piyopiyo@gmail.com" }
  ].freeze
  desc "import_user" # descにはタスクの説明を書く。
  task import: :environment do
    # この中に登録したいタスクの内容を書く。
    ActiveRecord::Base.transaction do
      USERS.each do |u|
        user = User.find_or_initialize_by(name: u[:name])
        user.assign_attributes(name: u[:name], email: u[:email] )
        user.save!
      end
    end
  end
end
```

##### 記事データ用
```lib/tasks/import_article.rake
namespace :import_article do
  ARTICLES = [
    { title: "記事１", text: "hogehoge" },
    { title: "記事2", text: "fugafuga" },
    { title: "記事3", text: "piyopiyo" }
  ].freeze
  desc "import_article" # descにはタスクの説明を書く。
  task import: :environment do
    # この中に登録したいタスクの内容を書く。
    ActiveRecord::Base.transaction do
      ARTICLES.each do |u|
        article = Article.find_or_initialize_by(title: u[:title])
        article.assign_attributes(title: u[:title], text: u[:text] )
        article.save!(validate: false)
      end
    end
  end
end

```

#### 追加したrakeタスクの実行コマンドの探し方

```
rake -T | grep import

# 以下、実行コマンド
rake import_article:import              # import_article
rake import_user:import                 # import_user
```

#### rakeタスクの実行
```
RAILS_ENV=development bundle exec rake import_user:import
RAILS_ENV=development bundle exec rake import_article:import
```

### シェルスクリプトの準備

以下のコマンドで、import.shというファイルを新規作成する。

```
vi import.sh
```

viエディタで開いたファイルはデフォルトだと閲覧モードになっているため、編集モードにしてからでないとファイルを書き換えられない。編集モードにするには i を押す。

```
#!/bin/sh
cd ~/user_article_import
RAILS_ENV=development bundle exec rake import_user:import
RAILS_ENV=development bundle exec rake import_article:import
```

編集モードにした後は、上記の内容を書き込む。
`#!/bin/sh` はシェルスクリプトを使用できるようにするための定型文
`cd ~/user_article_import` で `rails new`で作った際のプロジェクトの一番上の階層に移動する。
`RAILS_ENV=development bundle exec rake import_user:import`
`RAILS_ENV=development bundle exec rake import_article:import`
を入力することで、先ほど用意したrakeタスクをシェルスクリプトに登録する。
その後、esc → :wqでファイルを保存してエディタを閉じる。

### シェルスクリプトの実行

```
sh import.sh
```

ファイル名の前に`sh`をつけることで実行権限を変更しなくてもシェルスクリプトを実行できる。

## 最後に
バッチ処理と組み合わせて定期的に実行したい処理を登録したりするときにもrakeタスクは使えそうだし、業務でよく使うコマンド操作をシェルスクリプトにまとめて登録しておけば業務スピードが上がりそうだなと感じました。
もっと使いこなせるようになって、業務の効率化を行っていこうと思いました。

もしこの記事を見て、ためになったと感じていただけたなら、LGTMをいただけますと幸いです。