通过COPY命令进行数据导入或导出

通过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版本为例进行说明。

  1. 将待导入的数据存储于/tmp/test_data.txt中。

  2. 执行以下命令,查看待导入的TXT文件内容。

    cat /tmp/test_data.txt

    例如,返回结果如下:

    zhangsan|1
    lisi|2
    wangwu|3
    zhaoliu|4
  3. (可选)将目标RDS PostgreSQL实例数据库用户(例如testdbuser)的密码配置至环境变量中。以下的testpwd仅为示例,请根据实际情况进行替换。

    您也可以选择在执行导入命令时,手动输入数据库用户的密码。

    export PGPASSWORD='testpwd'
  4. 执行以下命令,将/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时,表示数据导入成功。

  5. 连接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版本为例进行说明。

  1. 将待导入的数据存储于/tmp/test_data.txt中。

  2. 执行以下命令,查看待导入的TXT文件内容。

    cat /tmp/test_data.txt

    例如,返回结果如下:

    zhangsan|1
    lisi|2
    wangwu|3
    zhaoliu|4
  3. (可选)将目标RDS PostgreSQL实例数据库用户(例如testdbuser)的密码配置至环境变量中。以下的testpwd仅为示例,请根据实际情况进行替换。

    您也可以选择在连接RDS PostgreSQL实例时,手动输入数据库用户的密码。

    export PGPASSWORD='testpwd'
  4. 执行以下命令,连接目标RDS PostgreSQL实例。命令中的连接信息仅为示例,请根据实际替换。

    psql -h pgm-bp1131jrd8lr****.pg.rds.aliyuncs.com -p 5432 -U testdbuser -d testdb
  5. 执行以下\COPY命令,将/tmp/test_data.txt中的数据导入到目标RDS PostgreSQL实例的测试表(testtable)中。

    \COPY testtable FROM '/tmp/test_data.txt' WITH ( delimiter '|' );

    当返回类似COPY 4时,表示数据导入成功。

  6. 执行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)中的数据导出为例进行说明。

  1. (可选)将目标RDS PostgreSQL实例数据库用户(例如testdbuser)的密码配置至环境变量中。以下的testpwd仅为示例,请根据实际情况进行替换。

    您也可以选择在执行导出命令时,手动输入数据库用户的密码。

    export PGPASSWORD='testpwd'
  2. 执行以下命令,将测试表(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"
  3. 执行以下命令,查看导出的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)中的数据导出为例进行说明。

  1. (可选)将目标RDS PostgreSQL实例数据库用户(例如testdbuser)的密码配置至环境变量中。以下的testpwd仅为示例,请根据实际情况进行替换。

    您也可以选择在连接RDS PostgreSQL实例时,手动输入数据库用户的密码。

    export PGPASSWORD='testpwd'
  2. 执行以下命令,连接目标RDS PostgreSQL实例。命令中的连接信息仅为示例,请根据实际替换。

    psql -h pgm-bp1131jrd8lr****.pg.rds.aliyuncs.com -p 5432 -U testdbuser -d testdb
  3. 执行以下命令,将测试表(testtable)中的数据导出至/tmp/test_outdata文件中。

    \COPY testtable TO '/tmp/test_outdata' WITH csv header;

    当返回类似COPY 4时,表示数据导出成功。

  4. 执行以下命令,断开与数据库连接。

    exit
  5. 执行以下命令,查看导出的CSV文件内容。

    cat /tmp/test_outdata

    例如,返回结果如下:

    name,id
    zhangsan,1
    lisi,2
    wangwu,3
    zhaoliu,4