PREPARATION
受験対策

オススメ!OSS-DB情報

第7回 テキストファイル(CSVなど)の入出力

データベースと他のアプリケーションの間でデータのやり取りをする場合、テキストファイルがよく使われます。なかでも利用頻度が高いのは、カンマあるいはタブでデータを区切った形式です。
PostgreSQLでは、psql ツールを使って、データベースの内容をテキストファイルに出力したり、テキストファイルを読み込んでテーブルにアップロードすることができます。

psql でテーブルの内容をテキストファイルに出力するには、\copy メタコマンドを使います。
使い方は
\copy table_name to file_name [option]
という形式で、table_name で指定したテーブルの内容が、file_name で指定したファイルに出力されます。デフォルトはタブ区切りのテキストファイルになりますが、オプションで csv と指定すると、カンマ区切りのCSV形式になります。
同じように、
\copy table_name from file_name [option]
とすれば、file_name で指定したファイルを読み取り、table_name で指定したテーブルにアップロードします。

PostgreSQL による SQL の独自拡張の COPY というコマンドでも、テキストファイルの入出力ができます。名前も機能もほぼ同じなので、\copy メタコマンドと混同しないように注意してください。
使い方も非常によく似ており、
COPY table_name TO 'file_name' [option];
という形式です。SQL として処理されるので、ファイル名はシングルクォートで括る必要があります。またコマンドの最後にセミコロンを入力しなければサーバーに送信されません。
デフォルトがタブ区切りのテキストファイルであることも \copy メタコマンドと同じですが、カンマ区切り(CSV形式)にするオプションは FORMAT csv なので、少しだけ違います。
COPY table_name FROM 'file_name' [option];
とすればテキストファイルからアップロードできます。

\copy と COPY で最も注意すべき違いは、前者がクライアントの psql で処理されるのに対し、後者はデータベースサーバで処理される、ということです。従って、ファイル名も \copy の場合はクライアントマシン上の相対パスで指定しますが、COPY では、サーバマシン上の絶対パスで指定します。また、COPY はサーバマシン上のファイルを読み書きすることになるため、管理者ユーザでなければ実行できない、というセキュリティ上の制限があります。

なお、\copy, COPY のいずれも、出力先として stdout、入力先として stdin(シングルクォートなし)を指定することができ、この場合はファイルではなく標準入出力(通常は端末)を使います。標準入出力を使う場合は、管理者ユーザでなくても COPY を使うことができます。

\copy の方が、COPY に比べて制限が少ないため便利なように思えますが、\copy ではクライアントとサーバの間のデータのやり取りが多くなるため、効率は COPY の方が良いです。処理の内容や目的によって、適切な方法を選ぶのが良いでしょう。

pg_dump コマンドを使ってテキスト形式のバックアップを作ると、その中には COPY table_name FROM stdin; によってデータをアップロードする部分があります。実際に pg_dump を実行して、出力ファイルの中身を調べてみましょう。

CSVなどテキストファイルの入出力は重要な機能なので、どの RDBMS でも何らかの手段を用意していますが、その方式は標準化されておらず、実装は RDBMS の種類によって大きく異なります。ここで紹介した \copy も COPY も PostgreSQL でのみ利用できる方法であることに注意してください。
例えば、MySQL では、SELECT 文の INTO 句でファイル名を指定することでファイル出力、LOAD DATA 文でテキストファイルを読み込んでテーブルにアップロードできます。

解説:松田神一

応募者全員プレゼント!
オープンソース データベース標準教科書 -PostgreSQL-