こんにちは、さるまりんです。
テーブルの中身をCSVに書き出す。
以前、PosgreSQLのpsql
でやりました。
これをMySQLでやってみます。
↓の構文でSELECT
の結果をファイルに書き出せます。
SELECT カラム名 FROM テーブル名 INTO OUTFILE 'ファイル名'
例えばcustomers
テーブルのid
とname
をcustomers.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)
これはユーザーsalu
がsalumarine
のホームディレクトリに書き出す権限がないから発生するようです。
コマンドラインから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で違います。
普段使ってないと忘れてしまうので、ここに戻ればわかるかな。
便利な機能を便利に使って時間短縮。これからも勉強していきたいと思います。
読んでくださってありがとうございました。
それではまた!