开发者

Postgres copy命令导入导出数据的操作方法

开发者 https://www.devze.com 2024-08-10 12:56 出处:网络 作者: wtopps
目录前言copy命令导出CSV:导入CSV:注意事项:前言 最近有需要对数据进行迁移的需求,由于postgres性能的关系,单表3000W的数据量查询起来有一些慢,需要对大表进行切割,拆成若干个子表,涉及到原有数据要迁移到子
目录
  • 前言
  • copy命令
    • 导出CSV:
    • 导入CSV:
  • 注意事项:

    前言

    最近有需要对数据进行迁移的需求,由于postgres性能的关系,单表3000W的数据量查询起来有一些慢,需要对大表进行切割,拆成若干个子表,涉及到原有数据要迁移到子表的需求。起初的想法是使用存储过程,使用select insert方式进行,但是数据量大的时候耗时有点久,于是需要想别的办法,就发现了postgres本身支持的copy命令。

    copy命令

    COPY在PostgreSQL表和文件之间交换数据。 COPY TO把一个表的所有内容都拷贝到一个文件,而COPY FROM从一个文件里拷贝数据到一个表里(把数据附加到表中已经存在的内容里)。 COPY TO还能拷贝SELECT查询的结果。

    如果声明了一个字段列表,COPY将只在文件和表之间拷贝已声明字段的数据。 如果表中有任何不在字段列表里的字段,那么COPY FROM将为那些字段插入缺省值。

    带文件名的COPY指示PostgreSQL服务器直接从文件中读写数据。 如果声明了文件名,那么服务器必须可以访问该文件,而且文件名必须从服务器的角度声明。 如果使用了PROGRAM选项,则服务器会从指定的这个程序进行输入或是写入该程序作为输出。 如果使用了STDIN 或STDOUT选项,那么数据将通过客户端和服务器之间的连接来传输。

    常用参数说明:

    table_name

    现存表的名字(可以有模式修饰)

    column_name

    可选的待拷贝字段列表。如果没有声明字段列表,那么将使用所有字段

    query

    一个必须用圆括弧包围的SELECT或VALUES命令,其结果将被拷贝

    filename

    输入或输出文件的路径名。输入文件名可以是绝对或是相对的路径,但输出文件名必须是绝对路径。 Windows用户可能需要使用E”字符串和双反斜线作为路径名称

    PROGRAM

    需执行的程序名。在COPY FROM命令中,输入是从程序的标准输出中读取,而php在COPY TO中,命令的输出会作为程序的标准输入。

    注意,程序一般是在命令行界面下执行,当用户需要传递一些变量给程序时,如果这些变量的来源不是可靠的,用户必须小心过滤处理那些对命令行界面来说是有特殊意义的字符。 基于安全的原因,最好是使用固定的命令字符串,或者至少是应避免直接使用用户输入(应先过滤特殊字符)

    STDOUT

    声明输入将写入客户端应用

    FORMAT

    选择被读或者写的数据格式:text、csv(逗号分隔值),或者binary。 默认是text

    导出CSV:

    命令:

    COPY { table_name [ ( column_name [, ...] ) ] | ( query ) }
        TO { 'filename' | PROGRAM 'command' | STDOUT }
        [ [ WITH ] ( option [, ...] ) ]

    copy to的导出速度非常之快,经测试10W的数据量只需要3秒左右的时间

    示例:

    COPY user TO '/tmp/data/test.csv' WITH csv;

    也可以导出指定的属性:

    COPY user(name,password) TO '/tmp/data/test.csv' WITH csv;

    也可以使用select 语句:

    COPY (select * from user) TO '/tmp/data/test.csv' WITH csv;

    也可以指定要导出哪些字段:

    COPY (select name,age from user) TO '/tmp/data/test.csv' WITH csv header;

    导入CSV:

    命令:

    COPY table_name [ ( column_name [, ...] ) ]
        FROM { 'filename' | PROGRAM 'command' | STDIN }
        [ [ WITH ] ( option [, ...] ) ]

    示例:

    COPY user_1 FROM '/tmp/data/test.csv' WITH csv;

    导入命令基本与导出一样,只是将Thttp://www.devze.comO 改为 FROM

    如果导出的时候,指定了header属性,那么在导入的时候,也需要指定:

    COPY user_1(name, a编程客栈ge) FROM '/tmp/data/test.csv' WITH csv header;

    注意事项:

    第一点:

    copy命令必须在plsql命令行执行,执行用户必须为superuser,否则会提示:

    ERROR:  must be superuser to COPY to or from a file

    HINT:  Anyone can COPY to stdout or from st编程客栈din. psql's \copy command also works for anyone.

    普通用户进行执行,需要在copy前面加入 “\”,即 \copy即可

    第二点:

    如果导出的字段,有integer[]类型,直接导出,再导入的话,会有问题,解决办法是需要在导出的时候,进行处理:

    \COPY ( select coalesce(integer_array, '{}')::integer[] as integer_array from table ) TO '/tmp/data.csv' with csv header;

    更多详细信息,可以查看官方文档:

    http://www.postgres.cn/do编程客栈cs/9.3/sql-copy.html

    到此这篇关于Postgres copy命令导入导出数据的文章就介绍到这了,更多相关Postgres copy导入导出数据内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消