COPY コマンドを実行して、TXT や CSV などの形式のファイルを PostgreSQL データベースにインポートしたり、PostgreSQL データベースから指定された CSV ファイルにデータをエクスポートしたりできます。このトピックでは、COPY コマンドを実行して ApsaraDB RDS for PostgreSQL インスタンスにデータをインポートする方法と、ApsaraDB RDS for PostgreSQL インスタンスからデータをエクスポートする方法について説明します。
データをインポートする
非対話型インポート
コマンド
cat $dataFile | psql $dbName -h $host -p $port -U $userName -c "COPY $tableName from stdin with ( DELIMITER '|');" // $dataFile の内容を stdin にパイプし、psql を使用して $dbName データベースの $tableName テーブルにデータをインポートします。各行の列は '|' 文字で区切られます。パラメーター
COPYコマンドは、$dataFileファイルから$dbNameデータベースの$tableNameテーブルにデータをインポートします。$dataFileファイルでは、各行の列は|文字で区切られ、列の順序は$tableNameテーブルのスキーマと一致しています。$host、$port、$userNameは、それぞれ RDS for PostgreSQL インスタンスへの接続に使用するエンドポイント、ポート番号、ユーザー名を示します。詳細については、「エンドポイントとポート番号の表示と変更」をご参照ください。RDS for PostgreSQL では、PostgreSQL プロセスがデプロイされているサーバーにユーザーが直接ログインすることは許可されておらず、サーバー上のファイルの読み取りまたは書き込み権限も付与されていません。そのため、RDS for PostgreSQL インスタンスにファイルをインポートするには、まず
catコマンドを実行してファイルデータを標準出力(stdout)に出力し、パイプを介してstdoutをpsqlコマンドの標準入力(stdin)として渡す必要があります。このようにして、COPYコマンドはstdinからデータベーステーブルにデータをインポートできます。
詳細については、「COPY」をご参照ください。
例
次の例は、CentOS 7.9 環境から RDS for PostgreSQL インスタンスにファイルのデータをインポートする方法を示しています。
インポートするデータを
/tmp/test_data.txtファイルに保存します。次のコマンドを実行して、インポートする TXT ファイルの内容を表示します。
cat /tmp/test_data.txt出力例:
John|1 Smith|2 Tom|3 Jerry|4(オプション) RDS for PostgreSQL インスタンスのデータベースアカウントのパスワードを環境変数として設定します。次のコマンドのサンプルパスワード
testpwdを実際のパスワードに置き換えます。export PGPASSWORD='testpwd'説明環境変数として渡す代わりに、インポートコマンドに直接入力してパスワードを指定することもできます。
次のコマンドを実行して、
/tmp/test_data.txtファイルから RDS for PostgreSQL インスタンスのtesttableという名前のテストテーブルにデータをインポートします。cat /tmp/test_data.txt | psql testdb -h pgm-bp1131jrd8lr****.pg.rds.aliyuncs.com -p 5432 -U testdbuser -c "COPY testtable from stdin with ( DELIMITER '|');"COPY 4のようなメッセージが返された場合、データはインポートされています。RDS for PostgreSQL インスタンスに接続するを実行し、
SELECT文を実行して、インポートされたデータをテストテーブルtesttableに表示します。出力例:
name | id ----------+---- John | 1 Smith | 2 Tom | 3 Jerry | 4 (4 rows)
対話型インポート
コマンド
\COPY $tableName from '$dataFile' with ( delimiter '|' ); // psql を使用して $dataFile から $tableName テーブルにデータをインポートします。各行の列は '|' 文字で区切られます。このコマンドを実行する前に、RDS for PostgreSQL インスタンスにログインする必要があります。
パラメーター
\COPY コマンドは、$dataFile ファイルから RDS for PostgreSQL インスタンスの $tableName テーブルにデータをインポートします。$dataFile ファイルでは、各行の列は | 文字で区切られ、列の順序は $tableName テーブルのスキーマと一致しています。
詳細については、「psql」をご参照ください。
例
次の例は、CentOS 7.9 環境から RDS for PostgreSQL インスタンスにファイルのデータをインポートする方法を示しています。
インポートするデータを
/tmp/test_data.txtファイルに保存します。次のコマンドを実行して、インポートする TXT ファイルの内容を表示します。
cat /tmp/test_data.txt出力例:
John|1 Smith|2 Tom|3 Jerry|4(オプション) RDS for PostgreSQL インスタンスのデータベースアカウントのパスワードを環境変数として設定します。次のコマンドのサンプルパスワード
testpwdを実際のパスワードに置き換えます。export PGPASSWORD='testpwd'説明RDS for PostgreSQL インスタンスに接続するときに、パスワードを手動で入力することもできます。
次のコマンドを実行して、RDS for PostgreSQL インスタンスの
testdbデータベースに接続します。コマンドの接続情報を実際の値に置き換えます。詳細については、「エンドポイントとポート番号の表示と変更」をご参照ください。psql -h pgm-bp1131jrd8lr****.pg.rds.aliyuncs.com -p 5432 -U testdbuser -d testdb次の
\COPYコマンドを実行して、/tmp/test_data.txtファイルからtestdbデータベースのtesttableという名前のテストテーブルにデータをインポートします。\COPY testtable FROM '/tmp/test_data.txt' WITH ( delimiter '|' );COPY 4のようなメッセージが返された場合、データはインポートされています。SELECT文を実行して、インポートされたデータをテストテーブルtesttableに表示します。出力例:
name | id ----------+---- John | 1 Smith | 2 Tom | 3 Jerry | 4 (4 rows)
データをエクスポートする
非対話型エクスポート
コマンド
psql $dbName -h $host -p $port -U $userName -c "COPY (SELECT * from $tableName) TO STDOUT with CSV HEADER" -o "$dataFile" // $dbName データベースの $tableName テーブルからデータをエクスポートし、CSV 形式で $dataFile に保存します。パラメーター
COPYコマンドは、$dbNameデータベースの$tableNameテーブルのデータを CSV 形式で$dataFileファイルにエクスポートします。$host、$port、$userNameは、それぞれ RDS for PostgreSQL インスタンスへの接続に使用するエンドポイント、ポート番号、ユーザー名を示します。詳細については、「エンドポイントとポート番号の表示と変更」をご参照ください。RDS for PostgreSQL では、PostgreSQL プロセスがデプロイされているサーバーにユーザーが直接ログインすることは許可されておらず、サーバー上のファイルの読み取りまたは書き込み権限も付与されていません。そのため、テーブルのデータを CSV ファイルにエクスポートするには、まず
COPYコマンドを実行してデータを標準出力(stdout)に出力し、psqlコマンドの-oパラメーターを指定してstdoutから$dataFileファイルにデータをエクスポートする必要があります。
例
次の例は、テストテーブル testtable(データをインポートする セクションで説明)のデータを CentOS 7.9 環境にエクスポートする方法を示しています。
(オプション) RDS for PostgreSQL インスタンスのデータベースアカウントのパスワードを環境変数として設定します。次のコマンドのサンプルパスワード
testpwdを実際のパスワードに置き換えます。export PGPASSWORD='testpwd'説明環境変数として渡す代わりに、エクスポートコマンドに直接入力してパスワードを指定することもできます。
次のコマンドを実行して、テストテーブル
testtableから/tmp/test_outdataファイルにデータをエクスポートします。psql testdb -h pgm-bp1131jrd8lr****.pg.rds.aliyuncs.com -p 5432 -U testdbuser -c "COPY (SELECT * from testtable) TO STDOUT with CSV HEADER" -o "/tmp/test_outdata"次のコマンドを実行して、エクスポートされた CSV ファイルの内容を表示します。
cat /tmp/test_outdata出力例:
name,id John,1 Smith,2 Tom,3 Jerry,4
対話型エクスポート
コマンド
\COPY $tableName TO '$dataFile' WITH csv header; // psql を使用して $tableName テーブルからデータをエクスポートし、CSV 形式で $dataFile に保存します。このコマンドを実行する前に、RDS for PostgreSQL インスタンスにログインする必要があります。
パラメーター
\COPY コマンドは、RDS for PostgreSQL インスタンスの $tableName テーブルのデータを CSV 形式で $dataFile ファイルにエクスポートします。
例
次の例は、テストテーブル testtable(データをインポートする セクションで説明)のデータを CentOS 7.9 環境にエクスポートする方法を示しています。
(オプション) RDS for PostgreSQL インスタンスのデータベースアカウントのパスワードを環境変数として設定します。次のコマンドのサンプルパスワード
testpwdを実際のパスワードに置き換えます。export PGPASSWORD='testpwd'説明RDS for PostgreSQL インスタンスに接続するときに、パスワードを手動で入力することもできます。
次のコマンドを実行して、RDS for PostgreSQL インスタンスの
testdbデータベースに接続します。コマンドの接続情報を実際の値に置き換えます。詳細については、「エンドポイントとポート番号の表示と変更」をご参照ください。psql -h pgm-bp1131jrd8lr****.pg.rds.aliyuncs.com -p 5432 -U testdbuser -d testdb次のコマンドを実行して、テストテーブル
testtableから/tmp/test_outdataファイルにデータをエクスポートします。\COPY testtable TO '/tmp/test_outdata' WITH csv header;COPY 4のようなメッセージが返された場合、データはエクスポートされています。次のコマンドを実行して、
testdbデータベースから切断します。exit次のコマンドを実行して、エクスポートされた CSV ファイルの内容を表示します。
cat /tmp/test_outdata出力例:
name,id John,1 Smith,2 Tom,3 Jerry,4