基本を押さえておきましょう〜
シェルスクリプトから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ファイルを用意する必要有無、汎用性有無、のトレードオフになるので、適宜使い分ける必要がありそうです。