文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

シェルスクリプトからSQLを実行する3種類の方法

基本を押さえておきましょう〜


f:id:treeapps:20180424102046p:plain

シェルスクリプトからSQLを実行する場合、いくつか方法があります。

  • eオプションで実行
  • SQLファイルをリダイレクション
  • ヒアドキュメント

では、それぞれについてメリット・デメリットを見ていきましょう。

-eオプション

$ mysql -uroot test -e "select * from t_test"
+----+
| id |
+----+
|  1 |
+----+

メリット

  • 手軽に実行可能。
  • セミコロンで区切れば複数のSQLが書ける。

デメリット

ダブルクォートで囲んだ中でしかトランザクションが効きません。

つまり、

mysql -uroot test -e "begin;"
mysql -uroot test -e "delete from t_test;"
mysql -uroot test -e "commit;"

とかやっても効きません。当然ですね。

SQLファイルをリダイレクション

$ mysql -uroot test < t_test.sql
id
1

メリット

  • 大変使い勝手がよいです。
  • ファイル名の部分を変数に置き換えれば動的に読み込める。
  • シェルスクリプトとSQLを分離できる。
  • SQLファイル内はトランザクションが有効。

デメリット

  • SQLファイルを用意しないといけません。

ヒアドキュメント

$ cat t_test.sh 
#!/bin/sh
mysql -uroot test <<EOF
begin;
delete from t_test;
commit;
EOF

$ ./t_test.sh 
id
1

メリット

  • シェルスクリプトの変数が埋め込めます。例えば、select count(*) from $tableName とか変数を設定すれば、SQLファイルを用意せずに動的SQLが組める。
  • トランザクションが有効。

デメリット

  • シェルスクリプトとSQLが分離できない。

雑感

何種類か実行の方法がありますが、トランザクションが効く効かない、SQLファイルを用意する必要有無、汎用性有無、のトレードオフになるので、適宜使い分ける必要がありそうです。