MySQLでクエリの結果をcsvファイルに出力する方法

こんにちは、さるまりんです。

テーブルの中身をCSVに書き出す。
以前、PosgreSQLのpsqlでやりました。
これをMySQLでやってみます。

↓の構文でSELECTの結果をファイルに書き出せます。

SELECT カラム名 FROM テーブル名 INTO OUTFILE 'ファイル名'

例えばcustomersテーブルのidnamecustomers.csvに書き出します。

SELECT id, name FROM customers
 INTO OUTFILE '/home/salumarine/customers.csv'

このままだとCSVになっていないので、カンマを区切り文字として指定します。

SELECT id, name FROM customers
 INTO OUTFILE '/home/salumarine/customers.csv'
 FIELDS TERMINATED BY ','

改行文字も指定できます。

SELECT id, name FROM customers
 INTO OUTFILE '/home/salumarine/customers.csv'
 FIELDS TERMINATED BY ','
 LINES TERMINATED BY '\r\n'

ダブルクオートで囲むこともできます。

SELECT id, name FROM customers
 INTO OUTFILE '/home/salumarine/customers.csv'
 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
 LINES TERMINATED BY '\r\n'

ファイルに書き出すときにこんなエラーになることがあります。

mysql> SELECT id, name FROM customers INTO OUTFILE '/home/salumarine/customers.csv';
ERROR 1045 (28000): Access denied for user 'salu'@'%' (using password: YES)

これはユーザーsalusalumarineのホームディレクトリに書き出す権限がないから発生するようです。

コマンドラインからmysqlプログラムをそのまま呼び出してこんな風にすると回避できました。

$ mysql -usalu -p saludb -N -e "select id, name from customers" > /home/salumarine/customers.csv

-uでDBユーザーを-Nでヘッダなし、-eで実行するSQLを指定します。
ただ、上の方法ではタブ区切りになってしまってました。

$ mysql -usalu -p saludb -N -e "select id, name from customers" | sed -e 's/^/"/g' | sed -e 's/$/"/g' | sed -e 's/\t/","/g' > /home/salumarine/customers.csv

sedを使って、カンマ区切り+ダブルクオートで囲んでみました。

これで↑のINTO OUTFILEを使った時と同じようにできました。

同じことをするにもMySQLとPostgreSQLで違います。
普段使ってないと忘れてしまうので、ここに戻ればわかるかな。
便利な機能を便利に使って時間短縮。これからも勉強していきたいと思います。

読んでくださってありがとうございました。

それではまた!