MySQL SQLとbashヒアドキュメントをうまく使いこなそう!!
MySQLとヒアドキュメントをうまく使いこなされば、さくっとSQLをファイルを作ることができます。はじめは戸惑いますが慣れれば簡単です。数百回はやったかも(^^;) ヒアドキュメント(heredocument)自体は、MySQLとはまったく関係のない話、そもそもbashではありますが、MySQLとbashヒアドキュメントの相性は大変良いので、この機会に覚えておいたほうが良いかもしれません。 また、ヒアドキュメントを有効に活用できるようになれば、プログラムを作らなくても、シェルスクリプトだけで、バッチ処理を作ることも可能になり、なんにせよ、高速です!(プログラムが遅いっていっているわけではありませんのでそのは誤解しないでください)
ヒアドキュメントを使って、SQLファイルを作成する例
今回の例で、EOT の名前にしましたが、別に、DOCでも良いし、とにかくEOT ~ EOTの間が文中でかぶらないものであれば問題ないです。
SQL ファイルを生成し、それを、MySQLで実行する
MySQLでコマンドからSQLを直接実行するときは、 -e というオプションをつければいいのですが、長いSQLの場合一行にだらって書くのってめんどくさいですよね。だからSQLファイルをヒアドキュメントで事前に作ってMySQLでそのSQLファイルを読み込ませるって方法がスマートです
仕事に使えるLinuxシェルスクリプト~bashで作る実用サンプル41
SQLファイルを生成して、MySQLで実行
cat << EOT > /tmp/sample.sql SELECT table_schema, table_name, current_timestamp as wtime from information_schema.tables where table_schema = 'information_schema' ; EOT # パイプで実行する例 cat /tmp/sample.sql | mysql -u root -p # リダイレクトで実行する例 mysql -u root -p < /tmp/sample.sql
もうファイルなんていらねー。。とにかく、作ったSQLを直接MySQLに食わせたいなんていう場合はこちら
- ヒアドキュメントを直接MySQLで実行する
mysql -u root -p << EOT SELECT table_schema, table_name, current_timestamp as wtime from information_schema.tables where table_schema = 'information_schema' ; EOT
ヒアドキュメント内に変数をセットする
いろいろやっていくと、ヒアドキュメント内に予めセットした変数を入れたい場合がでてくると思います。 そんなときはこんな感じでやればいいです。
_text="テストです" cat << EOT > /tmp_sample.sql select '${_text}' ; EOT cat /tmp_sample.sql ----- select 'テストです' ; -----
ヒアドキュメント内に変数をセットする
いろいろやっていくと、ヒアドキュメント内に予めセットした変数を入れたい場合がでてくると思います。 そんなときはこんな感じでやればいいです。
_text="テストです" cat << EOT > /tmp_sample.sql select '${_text}' ; EOT cat /tmp_sample.sql ----- select 'テストです' ; -----
(逆に)ヒアドキュメントの内容を変数展開しないで!!って場合
最初のEOTをシングルクォーテーションで括ります
_text="テストです" cat << 'EOT' > /tmp_sample.sql select '${_text}' ; EOT cat /tmp_sample.sql ----- select '${_text}' ; -----
注意事項
EOT の前後にはスペースも何もいれちゃだめです。(入れて良いのは改行のみ)ここだけ注意すれば後は楽勝です
活用事例
極端な例でありますが、ヒアドキュメントとSQLを応用して、スクリプトファイルそのものも作成することが可能です