Postgresql 批量插入命令COPY使用
在很多场景下,我们经常会遇到将某个Excel或Csv文件中的数据,插入到Postgresql。对于这个需求,我们常规的处理办法就是将文件中的数据,按照文件表头名称转换成集合对象然后插入到数据库,当然这对于数据体量不大的文件而言,很显眼没有任何问题,但是如果数据体量一旦上来,将面临如下问题:
- 将文件中的数据转换为集合对象,就有可能造成内存溢出;
- 就算内存没有溢出,那么这么大的数据,分批插入效率也能难满足需求;
针对上述问题,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,所以不知道是自己哪里没理解还是本身这个就有问题,麻烦了解的朋友给说明下。
Postgresql 批量插入命令COPY使用的更多相关文章
- postgresql批量插入copy_from()的使用
在批量插入postgresql时想使用同Mysql的语法时发现并不能使用: cursor.executemany("INSERT INTO persons VALUES (%d, %s, % ...
- 2017.9.15 postgresql批量插入造成冲突后执行更新
参考来自:https://stackoverflow.com/questions/40647600/postgresql-multi-value-upserts/46233907#46233907 1 ...
- postgresql优化数据的批量插入
原文:http://www.cnblogs.com/mchina/archive/2012/08/11/2537393.html 有以下几种方法用于优化数据的批量插入. 1. 关闭自动提交: ...
- mysql命令行批量插入100条数据命令
先介绍一个关键字的使用: delimiter 定好结束符为"$$",(定义的时候需要加上一个空格) 然后最后又定义为";", MYSQL的默认结束符为" ...
- 解决Oracle+Mybatis批量插入报错:SQL 命令未正确结束
Mybatis批量插入需要foreach元素.foreach元素有以下主要属性: (1)item:集合中每一个元素进行迭代时的别名. (2)index:指定一个名字,用于表示在迭代过程中,每次迭代到的 ...
- MyBatis操作Oracle批量插入 ORA-00933: SQL 命令未正确结束
最近在使用MyBatis操作Oracle数据库的时候,进行批量插入数据,思路是封装一个List集合通过Myabtis 的foreach标签进行循环插入,可是搬照Mysql的批量插入会产生 异常 ### ...
- 聊聊编程开发的数据库批量插入(sql)
这里的批量插入,主要是支持SQL的大型存储数据库,本文以Mysql,Oracle,SqlServer,postgresql4类来说明,这大概是国内应用比较多的了.其余的应该可以按照这些去找.提到编程的 ...
- FreeSql (六)批量插入数据
var connstr = "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;" + "Initia ...
- MyBatis魔法堂:Insert操作详解(返回主键、批量插入)
一.前言 数据库操作怎能少了INSERT操作呢?下面记录MyBatis关于INSERT操作的笔记,以便日后查阅. 二. insert元素 属性详解 其属性如下: parameterType ...
- Entity Framework与ADO.NET批量插入数据性能测试
Entity Framework是.NET平台下的一种简单易用的ORM框架,它既便于Domain Model和持久层的OO设计,也提高了代码的可维护性.但在使用中发现,有几类业务场景是EF不太擅长的, ...
随机推荐
- python 之路,致那些年,我们依然没搞明白的编码
摘自:金角大王https://www.cnblogs.com/alex3714/articles/7550940.html 本节内容 编码回顾 编码转换 Python的bytes类型 编码回顾 在备编 ...
- IntelliJ IDEA上手这一篇就够了,从入门到上瘾
前言 每次换电脑,最最最头疼的事情莫过于安装各种软件和搭建开发环境.这算是不想换电脑的一个原因吧(最主要还是穷).除非是电脑坏了开不了机或者点一下卡一下,真不想换电脑.每次换电脑都得折腾好久. 趁着这 ...
- 300行代码模拟cdn
这一生听过许多道理,但还是过不好这一生,这是因为缺少真正的动手实践,光听道理,缺少动手实践的过程,学习难免会让人觉得味同嚼蜡,所以我的分享都比较倾向于实践,在一次次动手实践的过程中感受知识原本纯真的模 ...
- 11. Mybatis的逆向工程
正向工程:先创建 Java 实体类,由框架负责根据实体类生成数据库表. Hibernate 是支持正向工 程的. 逆向工程:先创建数据库表,由框架负责根据数据库表,反向生成如下资源: Java 实体类 ...
- Java猜数字,猜完一局以后,输入y继续下一次游戏,否则结束
代码如下: public static void main(String[] args) { String x = ""; do { int random = (int) (Mat ...
- Linux下日志管理工具Logrotate
背景: 项目上的Nginx和Tomcat已经跑了大半年了,Nginx的access.log和error.log将近1G大小:Tomcat下的catalina.out日志经常跑到打不出日志然后进行手动移 ...
- GC 分代回收算法
GC 分代回收算法 1.首先了解JVM堆内存是如何分配的. 年轻代内部 生成区 和 S0 S1 的比例 默认情况下是 8:1 :1 堆内存和永久代存储的内容有区别: 堆内存主要存储的是 : 对象, ...
- 基于词袋(Bag of Words)和SVM的图片分类
目录 摘要 源码及完整报告: 词袋(Bag of Words, BoW) 基于词袋模型的图片分类基本流程 多尺度空间极值点检测 关键点精确定位 关键点主方向计算 生成描述子 特征词典的生成 SVM分类 ...
- 查看C语言程序对应的汇编代码
在终端输入 gcc -S main.c 命令的意思是 编译不汇编 mian.c 可以换成想要汇编的C语言程序 然后生成 main.s 使用文本编辑器查看即可
- 【HTML】TinyMCE 编辑器
HTML编辑器 一.页面效果 二.引入JS.CSS <!DOCTYPE html> <html lang="en"> <head> <me ...