MySQLからファイル出力(INTO OUTFILEが使えない場合、ヘッダーを省きたい場合)

はじめに

MySQLのSELECT結果をファイルにTSV形式(タブ区切り)で書き出したい時、
基本的にはINTO OUTFILEを使えば良いです。(参考:MySQLのSELECT結果をファイル出力する方法とよくあるエラー | pixelbeat sandbox)
ただ、INTO OUTFILEはファイル書き込みの権限が必要なため、このやり方ではできないこともあります。

そんな時はコマンドラインからリダイレクトで書き出すというやり方があります。
2つの書き方を紹介します。

1. echoでクエリをパイプで渡す

echo 'SELECT * FROM test_table' | mysql -u user -p db_name > result1.tsv

2. mysqlに–executeオプションを付けて実行 : ヘッダーを省きたい場合

1の方法だと、ヘッダーが含まれてしまいます。
もし含めたくない場合、mysqlコマンドでオプションに--executeを付ける方法を取ります。
追加で-N(=ヘッダーを含めない)と-B(=タブ区切りにする)のオプションを付けることでやりたいことを実現できます。

mysql -u user -p db_name -N -B --execute='SELECT * FROM test_table' > result1.tsv

ハマりポイント

クエリをクオテーションで囲む必要があるので、クエリの中でもクオテーションを使う場合は気を付けましょう。

クエリを囲むのはシングルクオテーション(')/ダブルクオテーション(")のどちらでもいけますので、
クエリでは、囲むのに使ったクオテーション以外のクオテーションを使うか、エスケープを使いましょう。

NG

mysql -u user -p db_name -N -B --execute='SELECT * FROM test_table WHERE name = 'fuga'' > result1.tsv

OK

mysql -u user -p db_name -N -B --execute="SELECT * FROM test_table WHERE name = 'fuga'" > result1.tsv
mysql -u user -p db_name -N -B --execute='SELECT * FROM test_table WHERE name = "fuga"' > result1.tsv

終わりに

今回紹介した方法は、コマンド実行の度にパスワードを入力する必要があり、書き出したいテーブルやクエリが多い場合は少し面倒という難点があります。
一度のパスワード入力で済む方法が知りたい…

参考