通过COPY命令,可以将TXT、CSV等格式的文件导入到PostgreSQL中,同时也支持将PostgreSQL中的数据以CSV格式导出至指定文件。本文介绍在RDS PostgreSQL实例中,如何使用COPY命令进行数据的导入和导出。
导入数据
非交互式
命令
cat $dataFile | psql $dbName -h $host -p $port -U $userName -c "COPY $tableName from stdin with ( DELIMITER '|');"
参数说明
通过
COPY
命令,将$dataFile
文件中的数据导入到$dbName
数据库下的$tableName
表中,其中$dataFile
文件中每行数据的不同列用|
符号做分隔,并且列的顺序与$tableName
表的结构保持一致。$host
、$port
和$userName
分别为目标RDS PostgreSQL的连接地址、端口及用户名。如何获取请参见查看连接地址和端口。由于RDS PostgreSQL不支持用户直接登录到部署PostgreSQL进程的主机,并且不开放读写主机文件的权限,因此需要先使用
cat
命令将文件内容输出到标准输出stdout
中,然后通过管道将该cat
命令的标准输出作为下一条psql
命令的标准输入,最后通过COPY
命令将标准输入stdin
中的数据导入到数据库表中。
更多内容请参见社区文档。
示例
以下操作以CentOS 7.9版本为例进行说明。
将待导入的数据存储于
/tmp/test_data.txt
中。执行以下命令,查看待导入的TXT文件内容。
cat /tmp/test_data.txt
例如,返回结果如下:
zhangsan|1 lisi|2 wangwu|3 zhaoliu|4
(可选)将目标RDS PostgreSQL实例数据库用户(例如testdbuser)的密码配置至环境变量中。以下的
testpwd
仅为示例,请根据实际情况进行替换。您也可以选择在执行导入命令时,手动输入数据库用户的密码。
export PGPASSWORD='testpwd'
执行以下命令,将
/tmp/test_data.txt
中的数据导入到目标RDS 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
时,表示数据导入成功。连接PostgreSQL实例,执行
SELECT
语句查看测试表(testtable)中已导入的数据。例如,本示例返回结果如下:
name | id ----------+---- zhangsan | 1 lisi | 2 wangwu | 3 zhaoliu | 4 (4 rows)
交互式
命令
\COPY $tableName from '$dataFile' with ( delimiter '|' );
此命令需登录到目标RDS PostgreSQL实例后执行。
参数说明
通过\COPY
命令,将$dataFile
文件中的数据导入到目标数据库下的$tableName
表中,其中$dataFile
文件中每行数据的不同列用|
符号做分隔,并且列的顺序与$tableName表的结构保持一致。
更多内容请参见社区文档。
示例
以下操作以CentOS 7.9版本为例进行说明。
将待导入的数据存储于
/tmp/test_data.txt
中。执行以下命令,查看待导入的TXT文件内容。
cat /tmp/test_data.txt
例如,返回结果如下:
zhangsan|1 lisi|2 wangwu|3 zhaoliu|4
(可选)将目标RDS PostgreSQL实例数据库用户(例如testdbuser)的密码配置至环境变量中。以下的
testpwd
仅为示例,请根据实际情况进行替换。您也可以选择在连接RDS PostgreSQL实例时,手动输入数据库用户的密码。
export PGPASSWORD='testpwd'
执行以下命令,连接目标RDS PostgreSQL实例。命令中的连接信息仅为示例,请根据实际替换。
psql -h pgm-bp1131jrd8lr****.pg.rds.aliyuncs.com -p 5432 -U testdbuser -d testdb
执行以下
\COPY
命令,将/tmp/test_data.txt
中的数据导入到目标RDS PostgreSQL实例的测试表(testtable)中。\COPY testtable FROM '/tmp/test_data.txt' WITH ( delimiter '|' );
当返回类似
COPY 4
时,表示数据导入成功。执行
SELECT
语句查看测试表(testtable)中已导入的数据。例如,本示例返回结果如下:
name | id ----------+---- zhangsan | 1 lisi | 2 wangwu | 3 zhaoliu | 4 (4 rows)
导出数据
非交互式
命令
psql $dbName -h $host -p $port -U $userName -c "COPY (SELECT * from $tableName) TO STDOUT with CSV HEADER" -o "$dataFile"
参数说明
通过
COPY
命令,将$dbName
数据库下的$tableName
表的内容以CSV格式导出到$dataFile
文件中。$host、$port、$userName
分别为目标RDS PostgreSQL的连接地址、端口及用户名。如何获取请参见查看连接地址和端口。由于RDS PostgreSQL不支持用户直接登录到部署PostgreSQL进程的主机,并且不开放读写主机文件的权限,因此需要先将待导出的内容通过
COPY
命令导出的标准输出stdout
中,然后再通过psql
命令的-o
参数将标准输出stdout
中的内容写入到$dataFile
文件中。
示例
以下操作基于CentOS 7.9版本,以将上文测试表(testtable)中的数据导出为例进行说明。
(可选)将目标RDS PostgreSQL实例数据库用户(例如testdbuser)的密码配置至环境变量中。以下的
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 zhangsan,1 lisi,2 wangwu,3 zhaoliu,4
交互式
命令
\COPY $tableName TO '$dataFile' WITH csv header;
此命令需登录到目标RDS PostgreSQL实例后执行。
参数说明
通过\COPY
命令,将目标数据库下的$tableName
表的内容以CSV格式导出到$dataFile
文件中。
示例
以下操作基于CentOS 7.9版本,以将上文测试表(testtable)中的数据导出为例进行说明。
(可选)将目标RDS PostgreSQL实例数据库用户(例如testdbuser)的密码配置至环境变量中。以下的
testpwd
仅为示例,请根据实际情况进行替换。您也可以选择在连接RDS PostgreSQL实例时,手动输入数据库用户的密码。
export PGPASSWORD='testpwd'
执行以下命令,连接目标RDS PostgreSQL实例。命令中的连接信息仅为示例,请根据实际替换。
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
时,表示数据导出成功。执行以下命令,断开与数据库连接。
exit
执行以下命令,查看导出的CSV文件内容。
cat /tmp/test_outdata
例如,返回结果如下:
name,id zhangsan,1 lisi,2 wangwu,3 zhaoliu,4