LinuxのコマンドラインからMySQLのクエリを実行して、その結果をCSV形式で出力する簡単な方法はありますか?
今やっているのはこんな感じです。
mysql -u uid -ppwd -D dbname << EOQ | sed -e 's/ /,/g' | tee list.csv
select id, concat("\"",name,"\"") as name
from students
EOQ
引用符で囲まなければならない列がたくさんある場合や、エスケープしなければならない引用符が結果に含まれている場合は、面倒になります。
From http://www.tech-recipes.com/rx/1475/save-mysql-query-results-into-a-text-or-csv-file/
SELECT order_id,product_name,qty
FROM orders
WHERE foo = 'bar'
INTO OUTFILE '/var/lib/mysql-files/orders.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';
このコマンドを使用すると、カラム名はエクスポートされません。
また、/var/lib/mysql-files/orders.csv
は MySQL を実行している server 上にあることに注意してください。MySQLプロセスが実行されているユーザは、選択されたディレクトリへの書き込み権限を持っていなければ、コマンドは失敗します。
リモートサーバー(特にHerokuやAmazon RDSのようなホストマシンや仮想化マシン)からローカルマシンに出力を書き込みたい場合、このソリューションは適していません。
mysql --batch, -B としています。
タブをカラムセパレータとして使用し、各行を改行して結果を印刷します。 新しい行に表示します。このオプションを使用すると、mysql は履歴ファイルを使用しません。 バッチモードでは、非タブラー出力フォーマットと特殊文字のエスケーピングが 特殊文字がエスケープされます。エスケープを無効にするには raw モードを使用してください。 raw オプションの説明を参照してください。
このモードでは、タブ区切りのファイルが出力されます。カンマ(またはカンマを含む文字列)はエスケープされないので、デリミタをカンマに変更するのは簡単ではありません。