通过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