首页 > 其他分享 >copy的使用

copy的使用

时间:2023-03-07 15:01:45浏览次数:40  
标签:tmp csv name COPY 使用 copy data

前言

最近有需要对数据进行迁移的需求,由于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命令中,输入是从程序的标准输出中读取,而在COPY TO中,命令的输出会作为程序的标准输入。

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

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

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

 

多行查询如何在COPY中优雅的使用

问题描述

使用元命令\copy处理较长的复杂查询语句生成的结果集时,要么我们借助临时表,要么我们需要对多行语句进行编辑,调整到一行,这是一件非常头疼的事儿!

问题解答

其实我们还有这种方式:

postgres=# copy (
               select *
               from foo
               where id<300
           ) to stdout with csv header \g foo.csv
COPY 5
  • 虽然\copy不支持多行查询,但copy支持。
  • copy结果除了输出到文件也可输出到标准输出stdout
  • 使用\g将标准输出的内容写入到本地文件

结合这三点,可以优雅的处理多行查询。

 

导出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;

导入命令基本与导出一样,只是将TO 改为 FROM

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

COPY user_1(name, age) 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 stdin. 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;
 

标签:tmp,csv,name,COPY,使用,copy,data
From: https://www.cnblogs.com/actively/p/17188137.html

相关文章

  • 使用MathNet.Numerics进行曲线拟合并使用SkiaSharp绘制曲线
    本文展示了如何使用MathNet.Numerics对离散点进行曲线拟合,计算其R^2值,并基于Winform使用SkiaSharp.Views.WindowsForms绘制曲线及离散点,上述组件可从NuGet获取。1、曲线拟......
  • MongoDB找出冗余和未被使用的索引
    找出冗余的索引varldb=db.adminCommand({listDatabases:1});for(i=0;i<ldb.databases.length;i++){if(ldb.databases[i].name!='admin'&&......
  • .NET 使用 Coverlet 统计单元测试覆盖率
    代码覆盖率(Codecoverage)是指在软件测试中测试用例执行时覆盖的代码量与总代码量的比例。代码覆盖率是软件测试中一个重要的指标,它对于保障软件质量、提高软件可靠性和可维......
  • 使用Python操作Mysql数据库(进阶)
    #-*-coding:utf-8-*-importloggingimportpymysqlfromrest_framework.responseimportResponselogger=logging.getLogger(__name__)#连接数据库def......
  • ChatGPT中文免费小程序(AI智能小聊) - ChatGPT国内小程序版在线使用
    ChatGPT中文网是一个面向中国用户的聊天机器人网站,旨在为国内用户提供一个自然的环境、有趣、实用的聊天体验。它使用最新的自然语言处理技术来帮助用户更好地理解他们的聊......
  • postman的一些使用方法
    1.当请求体为json格式时,如何添加注释(xml的时候注释很方便,但是json汇报注释一并作为请求体发出)在网上寻找到答案,利用请求前脚本去除掉json中注释的内容,实现无感处理。//......
  • 从0搭建Vue3组件库(五): 如何使用Vite打包组件库
    本篇文章将介绍如何使用vite打包我们的组件库,同时告诉大家如何使用插件让打包后的文件自动生成声明文件(*.d.ts)打包配置vite专门提供了库模式的打包方式,配置其实非......
  • Linux中gdal的使用
    四:Ubuntu中GDAL的使用(JavaWeb项目使用)1:整理文件,把生成的文件放置到gdal/java目录cp/home/zcx/Desktop/XQ/gdal-3.2.1/swig/java/gdal.jar/usr/local/pgsql/plugin/gd......
  • Marddown 使用VSCode预览 不显示图片 文件路径正确
    今天用Markdown写总结,图片变成了这样:文件路径是这个:C:\Users\dell\Desktop\A_Folder\#笔记开始以为是路径里有中文的原因,改成了全英文,但还是不显示。于是把"#"也删......
  • CMake基本使用
    1、cmakecmake是用于构建、测试和软件打包的跨平台工具2、优势避免硬编码路径可在多台计算机上构建一个包可做持续集成支持不同操作系统支持多个编译器可使用IDE......