MySQLで、シェルスクリプトからバッチ処理でSQLを実行する方法
SQL文をインラインで書いて実行することもできます。
mysql -h host -u user -ppassword dbname -e "INSERT INTO users (id, nickname) values (1, 'DQNEO');"
これを応用すれば、「データベースを初期化」→「テーブル作成」→「初期データ投入」のような作業を自動化することができます。
SQL文の中でシェル変数が使えるので非常に便利です。
以下に実際の応用例を示します。
サンプルコード
db_init.sh#!/bin/sh
# このスクリプト(db_init.sh)のディレクトリの絶対パスを取得
DIR=$(cd $(dirname $0); pwd)
# テーブル作成SQL
SQL_CREATE=$DIR/create_tables.sql
# 初期データインポート用のCSVファイル
CSV_RECORDS=$DIR/records.csv
CSV_KAMOKUS=$DIR/kamokus.csv
# MySQLをバッチモードで実行するコマンド
CMD_MYSQL="mysql -u dqneo -phimitsu kakeibo"
# テーブル作成SQL(外部ファイル)を実行
$CMD_MYSQL < $SQL_CREATE
# INSERT文を直接実行
$CMD_MYSQL -e "INSERT INTO users (id, nickname, created_on) values (1, 'DQNEO', now());"
# CSVデータをインポートする
$CMD_MYSQL -e " LOAD DATA LOCAL INFILE '$CSV_RECORDS' INTO TABLE records FIELDS TERMINATED BY ',' ENCLOSED BY '\'' "
$CMD_MYSQL -e "LOAD DATA LOCAL INFILE '$CSV_KAMOKUS' INTO TABLE kamokus FIELDS TERMINATED BY ',' "
# これが意外と便利。
# ヒアドキュメントで複数のSQL文を一括で実行する
#
$CMD_MYSQL <<EOF
update records set user_id = '1' ;
update kamokus set created_on = now();
update records set kasi_id = kasi_id + 50;
update records set user_id = '1' ;
update records set kari_id = 41 where kari_id = 0;
update kamokus set id = 41 where id = 0;
EOF
非常に便利なので一度試してみてはいかがでしょうか?
参考
MySQL :: MySQL 5.1 Reference Manual :: 3.5 Using mysql in Batch Mode
カテゴリ:
MySQL