2014/02/17

PowerShellで「mysql.exeで外部SQLファイルを引数に使う」方法

Windowsでmysqlクライアント(mysql.exe)を使う場合、何も考えなければコマンドプロンプト(cmd.exe)のCUIから利用するのが一般的でした。
時代も変わり、WindowsServer2008以降はPowerShellが標準のCUIに取って代わろうとしています。
PowerShellのCUIでもmysql.exeはほぼ同様に利用できますが、SQL文を外部ファイルから利用した場合に少し取り扱いが変わります。



.

入力のリダイレクト

コマンドプロンプトの時はこのように書いていました。
mysql -u myuser -p < C:\batch\hogehoge.sql
ところがこれをPowerShellのCUIで入力すると、
発生場所 行:1 文字:20
+ mysql -u myuser -p < C:\batch\hogehoge.sql
+                    ~
演算子 '<' は、今後の使用のために予約されています。
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : RedirectionNotSupported
と怒られます。
今後っていつだよ。 出力のリダイレクト'>'は使えるのにね。

パイプで渡す

最初に思いついたのはこれでした。 PowerShellからの構文で書けるPowerShellらしい書き方です。
PS >Get-Content C:\batch\hogehoge.sql | mysql -u myuser -p
Get-Contet(略式gc)でテキストの内容を取得してパイプで後述に渡します。

これで期待通りの動作はするのですが、mysql.exeからの出力を受け取る方法がちょっと違い、枠線が表示されません。
枠線が表示されないのは外部ファイルだからではなく、パイプで渡した場合の仕様のようです。
例えば「SHOW STATUS LIKE 'TABLE%';」をした場合はこうなります。
PS >"SHOW STATUS LIKE 'TABLE%';" | mysql -u myuser -p
Enter password:******
Variable_name   Value
Table_locks_immediate   493
Table_locks_waited      0
Table_open_cache_hits   0
Table_open_cache_misses 0
Table_open_cache_overflows      0


sourceコマンド

もう一つの案はこちら。 mysql.exeの--execute(略式-e)オプションとMySQLのsourceコマンドを利用する方法です。
PS >mysql -u myuser -p -e "source C:\batch\hogehoge.sql"
これはコマンドプロンプトでも全く同じ書き方で動作します。

また、-eオプションの場合は標準出力に枠線が表示されます。
PS >mysql -u myuser -p -e "SHOW STATUS LIKE 'TABLE%';"
Enter password:******
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Table_locks_immediate      | 493   |
| Table_locks_waited         | 0     |
| Table_open_cache_hits      | 0     |
| Table_open_cache_misses    | 0     |
| Table_open_cache_overflows | 0     |
+----------------------------+-------+

ちなみにこの結果を一度変数に入れてから表示させるとこうなります。
PS >$result = mysql -u myuser -p -e "SHOW STATUS LIKE 'TABLE%';"
Enter password:******
PS >$result
Variable_name   Value
Table_locks_immediate   493
Table_locks_waited      0
Table_open_cache_hits   0
Table_open_cache_misses 0
Table_open_cache_overflows      0
あれ既視感。


まとめ 外部ファイルにする場合の多くはバッチで実行するので結果など見ないでしょうし、更新のみのSQL文ならどちらでも同じなので、どちらでも構わないと思います。
好きなほうを使いましょう。

0 件のコメント:

コメントを投稿