今回は、各DB上のデータをCSVファイルに出力する方法について共有する。
前提条件
Windows端末上に、Oracle・MySQL・PostgreSQL・SQL Serverをそれぞれインストール済であること。また、salesテーブルを作成済であること。
Oracle・MySQL・PostgreSQLのインストール手順は下記記事を参照のこと。
また、SQL Serverのインストール手順は下記記事を参照のこと。
また、salesテーブルのデータは、例えばMySQLの場合、以下のデータが入っているものとする。
やってみたこと
Oracleの場合の実行結果
Oracleの場合の実行結果は、下記記事を参照のこと。
MySQLの場合の実行結果
MySQLのバージョン8.0の場合は、インストールした時点から、secure_file_privのディレクトリ設定がされていて、このディレクトリ以外にファイルを出力することができない。
secure_file_privの設定値は、以下のようにして確認できる。
1 | SHOW VARIABLES LIKE "secure_file_priv" |
また、CSVファイルの出力は、以下のように、SELECT (カラム名一覧) FROM (テーブル名) INTO OUTFILE (ファイルパス) (各種オプション)で行える。
1 2 3 4 5 6 7 8 | SELECT 'sale_date', 'product_name', 'place_name', 'sales_amount' UNION SELECT sale_date, product_name, place_name, sales_amount FROM world.sales INTO OUTFILE 'C:\\ProgramData\\MySQL\\MySQL Server 8.0\\Uploads\\output_sales.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' |
上記コマンドは、salesテーブルのデータを、secure_file_privで設定されたディレクトリ配下のCSVファイル「output_sales.csv」に、区切り文字:,(カンマ)、囲い文字:”(ダブルクォート)、改行文字:\r\nで出力する例となる。
上記コマンドで出力されたCSVファイルは、以下の通りとなる。
なお、secure_file_privで設定されたディレクトリ以外にCSVファイルを出力しようとすると、以下のようなエラーメッセージが出力される。
PostgreSQLの場合の実行結果
PostgreSQLの場合、salesテーブルのデータをCSVファイルに出力するのは、以下のように、COPY (テーブル名) TO (ファイルパス) (各種オプション)で行える。
1 2 | COPY sales TO 'D:\\work\\output_sales.csv' WITH CSV HEADER DELIMITER ',' FORCE QUOTE * |
上記コマンドは、CSVファイル「D:\work\output_sales.csv」に、salesテーブルのデータを、区切り文字:,(カンマ)、囲い文字:”(ダブルクォート)で出力する例となる。
上記コマンドで出力されたCSVファイルは、以下の通りとなる。
SQL Serverの場合の実行結果
SQL Serverの場合は、SQL Serverをインストール時にSQLCMDを利用すると、salesテーブルのデータをCSVファイルに出力することができる。
SQLCMDコマンドは、以下の場所に配置されている。
SQLCMDコマンドを利用して、salesテーブルのデータをCSVファイルに出力するのは、例えば以下のように行える。
1 2 | cd C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\130\Tools\Binn SQLCMD -S localhost -E -i d:\work\query.sql -s , -o d:\work\sqlserver_output_sales.csv -W -h -1 |
上記コマンドは、「-S localhost -E」でローカルSQLServerにWindows認証でログインし、クエリ「D:\work\query.sql」を利用し、区切り文字「,(カンマ)」とし、出力するCSVは「D:\work\sqlserver_output_sales.csv」とし、列から余計な空白を削除し、ヘッダ行を出力しない、という意味となる。
また、上記コマンドで読み込んでおく「query.sql」の内容は以下の通り。
1 2 3 4 5 6 7 8 9 10 | set nocount on select 'sale_date, product_name, place_name, sales_amount' select '"' + FORMAT(sale_date, 'yyyy/MM/dd HH:mm:ss') + '"' , '"' + product_name + '"' , '"' + place_name + '"' , '"' + CONVERT(varchar, sales_amount) + '"' from dbo.sales |
上記SQL文は、「X件処理されました」というメッセージを非表示とし、ヘッダ行を出力し、各データを文字列変換し囲い文字を”(ダブルクォート)として出力する、という意味となる。