psql コマンドラインインターフェイス (CLI) 内の \copy コマンドを使用して、ローカルのテキストファイルを AnalyticDB for PostgreSQL インスタンスに直接インポートします。サーバー側のファイルアクセスは不要です。
\copy はコーディネーター ノードを経由してデータをシリアルに書き込みます。小規模から中規模のデータセットには適していますが、大規模な並列インポートには不向きです。大量データのロードには、OSS を基盤とする外部テーブルをご利用ください。詳細については、「OSS からデータをインポートするための外部テーブルの使用」をご参照ください。
\copy と COPY の使い分け
両コマンドの構文は同一です(PostgreSQL ドキュメントの「COPY」を参照)が、実行されるコンテキストが異なります。
\copy は psql クライアント上で実行され、ローカルマシンからファイルを読み取ります。ファイルへのアクセスおよび権限は、データベースサーバーではなくローカルユーザーによって管理されます。つまり、SUPERUSER 権限は不要です。AnalyticDB for PostgreSQL は SUPERUSER 権限を付与しないため、サーバー側の COPY で FILE を使用することはできません。\copy を代わりに使用してください。
\copy | COPY | |
|---|---|---|
| 実行場所 | psql クライアント | データベースサーバー |
| ファイル読み取り元 | ローカルマシン | サーバーファイルシステム |
| SUPERUSER 権限の必要性 | 不要 | 必要(FILE アクセス時) |
| ハンドル | FILE、STDIN、STDOUT | STDIN、STDOUT のみ |
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
psql がインストール済みであり、ご利用の AnalyticDB for PostgreSQL インスタンスに接続済みであること
インポートするローカル テキストファイル
ターゲットテーブルに対して書き込み権限があること
ローカルファイルのインポート
psql セッション内で \copy コマンドを実行し、ファイルをテーブルにロードします。
\COPY table [(column [, ...])] FROM {'file' | STDIN}
[ [WITH]
[OIDS]
[HEADER]
[DELIMITER [ AS ] 'delimiter']
[NULL [ AS ] 'null string']
[ESCAPE [ AS ] 'escape' | 'OFF']
[NEWLINE [ AS ] 'LF' | 'CR' | 'CRLF']
[CSV [QUOTE [ AS ] 'quote']
[FORCE NOT NULL column [, ...]]
[FILL MISSING FIELDS]
[[LOG ERRORS [INTO error_table] [KEEP]
SEGMENT REJECT LIMIT count [ROWS | PERCENT] ]例: ローカルファイルからすべての行を test1 という名前のテーブルにインポートします。
\COPY test1 FROM '/path/to/localfile';インポート結果の確認
\copy の実行後、データが正常にロードされたかを確認します。
SELECT COUNT(*) FROM test1;行数がソースファイルと一致した場合、インポートは完了です。
LOG ERRORS を指定して実行した場合は、拒否された行を確認するためにエラーテーブルをクエリします。
SELECT * FROM error_table;psql ではなく JDBC を使用する
プログラムによるデータインポートを行うには、Java Database Connectivity (JDBC) をご利用ください。PostgreSQL JDBC ドライバーは CopyIn インターフェイスを提供しており、これは COPY 文をラップしています。詳細については、PostgreSQL JDBC ドキュメントの「Interface CopyIn」をご参照ください。