Database JUNKY

MySQL,MariaDBを中心としたブログです

MySQL SQLとbashヒアドキュメントをうまく使いこなそう!!

MySQLとヒアドキュメントをうまく使いこなされば、さくっとSQLをファイルを作ることができます。はじめは戸惑いますが慣れれば簡単です。数百回はやったかも(^^;) ヒアドキュメント(heredocument)自体は、MySQLとはまったく関係のない話、そもそもbashではありますが、MySQLbashヒアドキュメントの相性は大変良いので、この機会に覚えておいたほうが良いかもしれません。 また、ヒアドキュメントを有効に活用できるようになれば、プログラムを作らなくても、シェルスクリプトだけで、バッチ処理を作ることも可能になり、なんにせよ、高速です!(プログラムが遅いっていっているわけではありませんのでそのは誤解しないでください)

ヒアドキュメントを使って、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に食わせる

もうファイルなんていらねー。。とにかく、作った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を応用して、スクリプトファイルそのものも作成することが可能です

hit.hateblo.jp

f:id:hit10231023:20180309104332j:plain