shellscriptでDBに大量データを登録する

ストアドプロシージャ使えない(面倒)、Rails Console利用できない場合にBulk Insertする例。すぐ忘れるのでメモ。

#!/bin/bash
set -eu

DB_USER="root"
DB_PASS="pass"
DB_NAME="db"
DB_HOST="host"

INSERT_NUM=100000
BREAK_NUM=1000

function execute_sql () {
  local sql=$1
  mysql -u "${DB_USER}" -p"${DB_PASS}" -h "${DB_HOST}" "${DB_NAME}" -e "${sql}"
}

function main () {
  local insert_statement="INSERT INTO some_table (some_column)"
  insert_statement+=" VALUES"

  local bulk_count=0
  for((i=0;i<INSERT_NUM;i++)); do
    if [ $bulk_count -eq 0 ]; then
      sql="${insert_statement}"
    else
      sql+=", "
    fi

    # values
    sql+="('some_value')"
    bulk_count=$(expr $bulk_count + 1)

    if [ $bulk_count -eq $BREAK_NUM ]; then
      execute_sql "${sql}"
      bulk_count=0
    fi
  done

  # 端数のinsert
  if [ $bulk_count -ne 0 ]; then
      execute_sql "${sql}"
      bulk_count=0
  fi
}

main

久しぶりにshell書くといろいろ辛く感じる。。 rubyで書けばよかった。。