postgresql批量插入copy_from()的使用
在批量插入postgresql时想使用同Mysql的语法时发现并不能使用:
- cursor.executemany("INSERT INTO persons VALUES (%d, %s, %s)",[(1, 'John Smith', 'John Doe'),(2, 'Jane Doe', 'Joe Dog'),(3, 'Mike T.', 'Sarah H.')])
- 难道只能写成这样吗:
insert into A values(**********),(*************),(*****************)
- 但是这种方法及麻烦而且还不快
- 后发现了copy_from()这个神奇的方法!
- 在参考:https://blog.csdn.net/rongyongfeikai2/article/details/17935139 这位仁兄的博客后一直失败,提示缺少字段.这就很难受了,查阅所有百度的资料无解,大部分都是来回抄袭,毫无新意,这里又忍不住要吐槽百度了.
- 只能去Google看看了,进入pg的官网才豁然开朗
http://initd.org/psycopg/docs/cursor.html- COPY_FROM说明:
copy_from
(file,table,sep ='\ t',null ='\\ N',size = 8192,columns = None )
从类似文件的目标文件中读取数据,将它们附加到名为table的表中。
- file - 从中读取数据的类文件对象。它必须具有
read()
和readline()
方法。
- table - 要将数据复制到的表的名称。
- sep - 文件中预期的列分隔符。默认为选项卡。
- null -
NULL
文件中的文本表示。默认为两个字符串\N
。
- size - 用于从文件中读取的缓冲区的大小。
- columns - 可以使用要导入的列的名称进行迭代。长度和类型应与要读取的文件的内容相匹配。如果未指定,则假定整个表与文件结构匹配。
例: import StringIO >>> f = StringIO("42\tfoo\n74\tbar\n") >>> cur.copy_from(f, 'test', columns=('num', 'data')) >>> cur.execute("select * from test where id > 5;") >>> cur.fetchall() [(6, 42, 'foo'), (7, 74, 'bar')]注意:
表的名称未引用:如果表名包含大写字母或特殊字符,则必须使用双引号引用:
cur.copy_from(f, '"TABLE"')
- 不得不说上面哪位仁兄的不严谨性了,在批量插入的每个数据之间用<\t>分割,在一条数据的末尾用<\n>分割.
附本人代码段:
- tap = (indent_num, it.get(u'商品编码'),it.get(u'商品名称'),it.get(u'批发价'),it.get(u'零售指导价'),it.get(u'需求量'),it.get(u'订购量'),it.get(u'金额'),it.get(u'预计盈利'),cigarette_price)
values_list.append('\t'.join(tap)) s = ''
for value in values_list:
s += value + '\n' cur = self.conn.cursor() try:
# cur.executemany(insert_sql)
cur.copy_from(StringIO.StringIO(s), table,
columns=('indent_num', 'commodity_code', 'commodity_name', 'rade_price', 'guidance_price',
'requirement', 'order_quantity','amount_of_money','wholesale_price','cigarette_price'))
except Exception as e:
raise e
finally:
self.conn.commit()
print 'done'
postgresql批量插入copy_from()的使用的更多相关文章
- 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. 关闭自动提交: ...
- MyBatis魔法堂:Insert操作详解(返回主键、批量插入)
一.前言 数据库操作怎能少了INSERT操作呢?下面记录MyBatis关于INSERT操作的笔记,以便日后查阅. 二. insert元素 属性详解 其属性如下: parameterType ...
- 一条insert语句批量插入多条记录
一条insert语句批量插入多条记录 常见的insert语句,向数据库中,一条语句只能插入一条数据: insert into persons (id_p, lastname , firstName, ...
- spring data jpa开启批量插入、批量更新
spring data jpa开启批量插入.批量更新 原文链接:https://www.cnblogs.com/blog5277/p/10661096.html 原文作者:博客园--曲高终和寡 *** ...
- MyBatis :Insert (返回主键、批量插入)
一.前言 数据库操作怎能少了INSERT操作呢?下面记录MyBatis关于INSERT操作的笔记,以便日后查阅. 二.insert元素 属性详解 其属性如下: parameterType , ...
- 聊聊编程开发的数据库批量插入(sql)
这里的批量插入,主要是支持SQL的大型存储数据库,本文以Mysql,Oracle,SqlServer,postgresql4类来说明,这大概是国内应用比较多的了.其余的应该可以按照这些去找.提到编程的 ...
- 2017.7.7 postgreSQL在插入造成重复时执行更新
参考来自:https://stackoverflow.com/questions/1109061/insert-on-duplicate-update-in-postgresql/1109198#11 ...
- FreeSql (六)批量插入数据
var connstr = "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;" + "Initia ...
随机推荐
- noip20
T1 首先,这个插球,就是森林中连点,考虑dp,我们设 \(dp_{i,j}\) 表示有i个点的森林,有j个点在第一颗树中的概率,转移时考虑第i个点是否在第一颗子树里,转移方程: \[dp_{i,j} ...
- noip18
T1 来自cf原题 考场直接暴力枚举 \(A,B\),15pts. 正解: 首先时间的表达式,\(T=\frac{A}{a_{i}}+\frac{B}{b_{i}}\),然后以\(\frac{1}{a ...
- .net core 微服务参考文章
网址: https://www.cnblogs.com/edisonchou/p/9124985.html Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.Consul基础介绍 Co ...
- snoop的基本用法
关于Snoop的用法 snoop是开发wpf应用程序的利器.用它可以观察WPF的可视树,监听事件,更改元素属性等. 下面我介绍下snoop一些用法. 1.获取指定应用程序的UI 打 ...
- C#多线程---Mutex类实现线程同步
一.例子 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 ...
- 怎样在Qt中建立使用动态链接库
参考网址: https://blog.csdn.net/q496713258/article/details/6990837 qt 的学习网址: http://c.biancheng.net/view ...
- Linux下用gdb 调试、查看代码堆栈
Linux中用gdb 查看代码堆栈的信息 core dump 一般是在segmentation fault(段错误)的情况下产生的文件,需要通过ulimit来设置才会得到的. 调试的话输入: gd ...
- 关于Java for循环的注意点
1 import java.util.ArrayList; 2 3 public class Main { 4 5 public static void main(String[] args) { 6 ...
- js函数和封装
$就是jquery对象,$()就是jQuery(),在里面可以传参数,作用就是获取元素 js对象与jQuery对象的区别:jQuery对象是一个数组,jQuery对象转为js对象:[0] 取第一个即可 ...
- Layui引起的对前端的一次记录
前言 首先会做这次记录,也是因为自己也是第一次去接触这个框架,以前总是听说,并没有去用过.这次出于实习的原因,去学习了一下Layui这个"面向后端开发者的框架".其次,此篇记录仅供 ...