首页 > 数据库 >Postgresql 批量插入命令COPY使用

Postgresql 批量插入命令COPY使用

时间:2023-08-26 21:44:08浏览次数:38  
标签:文件 COPY Postgresql name 批量 header DELIMITER test csv

在很多场景下,我们经常会遇到将某个Excel或Csv文件中的数据,插入到Postgresql。对于这个需求,我们常规的处理办法就是将文件中的数据,按照文件表头名称转换成集合对象然后插入到数据库,当然这对于数据体量不大的文件而言,很显眼没有任何问题,但是如果数据体量一旦上来,将面临如下问题:

  1. 将文件中的数据转换为集合对象,就有可能造成内存溢出;
  2. 就算内存没有溢出,那么这么大的数据,分批插入效率也能难满足需求;

针对上述问题,Postgresql提供了批量插入神器,官方文档对copy给出了如下解释,认为COPY命令针对加载大量行进行了优化;它不如INSERT灵活,但对于大数据负载的开销要小得多。

也就是COPY命令比较适合大量行数据的快速插入,但是灵活度上没有Insert方便,下面主要说明下COPY命令的用法。   

COPY命令用法:
导入命令如下:
       Copy table_name[(column_name…)] from 'filename' [ [WITH] (option [, ...]) ] [where condition]
导出命令如下
      COPY { table_name [ ( column_name [, ...] ) ] | ( query ) } TO  'filename'  [ [ WITH ] ( option [, ...] ) ]

其中table_name为数据库表名称,我们可以根据文件名称和文件列表头来创建一个合适的表数据。

column_name为列名称,也就是我们可指定将数据填充到指定的某些列,如果不指定,则默认将数据列从左至右依次填充到每一个列中。

FILE 文件名称,即就是文件的绝对路径。

WITH 后面的option有如下选项:

FORMAT format_name    文件格式名称,主要有csv、txt、二进制文件

FREEZE [ boolean ]           不常用

DELIMITER 'delimiter_character'     分隔符,比如CSV默认分隔符逗号,txt默认是制表符,二进制文件中禁止使用此选项

NULL 'null_string'   指定表示空值的字符串。在文本格式中默认为\N,在CSV格式中默认为不加引号的空字符串

HEADER [ boolean ]   指定文件包含一个头行,其中包含文件中每个列的名称,一般用在csv文件中,值可以是true、on、1;

QUOTE 'quote_character'   指定在引用数据值时使用的引号字符,默认是双引号。

ESCAPE 'escape_character'   

FORCE_QUOTE { ( column_name [, ...] ) | * }   

FORCE_NOT_NULL ( column_name [, ...] )

FORCE_NULL ( column_name [, ...] )

ENCODING 'encoding_name'    指定对文本的编码格式,默认是客户端编码格式,可通过show client_encoding查看客户端编码;

WHERE condition    任何不满足此条件的行都不会被插入到表中。如果将实际行值替换为任何变量引用时该行返回true,则该行满足条件。

 

比如要将一个test.csv文件导入到数据库,首先根据CSV的表头信息创建数据库表test,字段包括gid、zipcode、telephone、name、address创建成功后,使用copy导入数据:

Copy test from ‘D:/test.csv’ with header DELIMITER ‘,’  

 

注意:小编在使用导入命令时,发现windows操作系统下,文件路径中如果有中文,无法导入,系统会报could not open file  for reading: Invalid argument这个错误。

 

如果gid是自增字段,数据中只有后续的几个字段,则我们可以在插入时,增加列名称:

Copy test(zipcode,telephone,name,address) from ‘D:/test.csv’ with header true DELIMITER ‘,’  

 

此时如果需要将test表中的数据导出,则使用如下命令:

Copy test to ‘D:/test_new.csv’  csv header  DELIMITER ‘,’  ENCODING 'UTF8';

 

对于导出数据中有中文的,特别说明下,如果我们导出的csv中的中文,试用excel查看是乱码的,但是试用其它文本编辑器(比如nodepad++)是好的,这时候只需要在文本编辑器中,将文件编码格式改为UTF-8-BOM就行,这应该是微软自己对文件编码格式的判断问题。

 

对于上面官方给出的说明文档,需要澄清以下几点:

官方文档的这个说明不知道是我理解错了,还是本身有问题,我按照它的说明使用不分参数,就会报错,比如:

Copy test to ‘D:/test_new.csv’ format csv header DELIMITER ‘,’  ENCODING 'UTF8';

意思是不需要加这个format的key,加上就会报语法错误;

再比如,官方文档指出header后面可以跟true,on,1表示开启,但实际加上就会报错,比如如果你写成下面的方式就会报语法错误:

Copy test to ‘D:/test_new.csv’ csv header true DELIMITER ‘,’  ENCODING 'UTF8';

因此只需要加上header,默认就是true,不加就是false。

而其它的key,比如DELIMITER,ENCODING就必须输入前面的key,所以不知道是自己哪里没理解还是本身这个就有问题,麻烦了解的朋友给说明下。

 

标签:文件,COPY,Postgresql,name,批量,header,DELIMITER,test,csv
From: https://www.cnblogs.com/share-gis/p/17659503.html

相关文章

  • linux系统批量查找网站源码并替换字符,查找替换指定内容
    问题描述:维护中需要批量修改代码中某个字符,如果单个打开页面进行修改则效率过低,linux系统下借助grep命令快速查找替换 命令示例1:grep-rl'查找的内容'.|xargssed-i's/查找的内容/替换的新内容/g'登录服务器后,根据实际情况输入需要查找/替换的内容即可,以上命令表示当......
  • 京东上货软件必备API(商品主图价格详情批量下载上传)
    一、引言在数字化快速发展的今天,电商平台的商品信息管理变得尤为重要。本文将重点介绍京东上货软件必备的API接口,帮助你实现商品主图、价格、详情的批量下载与上传,提高商品管理效率,优化用户体验。二、京东上货软件必备API  测试地址入口1、商品主图批量下载API通过此API接口,......
  • mongo批量更新的几种方法
    50w数据做测试看一下mongo支持批量更新的几种PAI 1.0publicUpdateResultupdateMulti(Queryquery,UpdateDefinitionupdate,Class<?>entityClass)2.0publicUpdateResultupdateMulti(Queryquery,UpdateDefinitionupdate,StringcollectionName)3.0......
  • 批量扫描二维码
    该脚本局限性较大,需要文件夹内的二维码图片命名为整型适合场景:二维码扫描结果为1或0,二维码数量庞大importzxingimportosfilepath=r"文件夹路径"l=os.listdir(filepath)l.sort(key=lambdax:int(x[:-4]))t=''foriinl:reader=zxing.BarCodeReader()......
  • 分享一个批量转换某个目录下的所有ppt->pdf的Python代码
    大家好,我是皮皮。一、前言前几天在Python最强王者群【Python小小小白】分享了一份Python自动化办公的代码,可以批量转换某个目录下的所有ppt->pdf,非常强大。二、实现过程在正式跑代码之后,你可能需要按照对应的库,不然会报错。代码运行之后,本地会出现下面的UI界面,选择PPT文件......
  • 国标视频云服务EasyGBS国标视频平台批量开启按需直播详细操作步骤
    国标视频云服务EasyGBS支持设备/平台通过国标GB28181协议注册接入,并能实现视频的实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。平台部署简单、可拓展性强,支持将接入的视频流进行全终端、全平台分发,分发的视频流包括RTSP、RTMP、FLV、HLS、WebRTC等格......
  • 国标视频云服务EasyGBS国标视频平台批量开启按需直播详细操作步骤
    国标视频云服务EasyGBS支持设备/平台通过国标GB28181协议注册接入,并能实现视频的实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。平台部署简单、可拓展性强,支持将接入的视频流进行全终端、全平台分发,分发的视频流包括RTSP、RTMP、FLV、HLS、WebRTC等......
  • Redis如何批量删除指定前缀的key
    批量删除指定前缀的Key有两中方法,一种是借助redis-cli,另一种是通过SCAN命令来遍历所有匹配前缀的key,并使用DEL命令逐个删除它们。redis-cli使用Redis自带的redis-cli命令行工具,你可以通过以下方式批量删除指定前缀的key:redis-cliKEYS"your_prefix*"|xargsredis......
  • SAP S4HANA 采购信息记录批量更新
    本文将会介绍通过Excel的方式进行采购信息记录的批量创建,更新,删除操作,可从purchasinginforecordsgeneral,purchaseorganization,pricingcondition以及scaleprice四个维度进行修改。输入事务代码:SPRO->MaterialsManagement->Purchasing->Excel-BasedDataExchange->Defi......
  • Commit failed (details follow): Working copy text base is corrupt Checksum misma
    问题:提交一个svn文件报错,提交其他文件没有报错解决办法:(网上看了很多方法都解决不了):1、把文件拷贝到svn目录外放着2、把svn目录下文件移除,然后commitsvn3、把目录外的文件拷贝进来,先Add,然后commit就成功了......