LoginSignup
2
1

More than 1 year has passed since last update.

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

Posted at

初めまして、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: "記事1", 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_importrails 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をいただけますと幸いです。

2
1
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
2
1