一看居然两三个月没写博文了。凑。最近去考了个试,老天保佑吧。

今天有个同事跑来问我,我之前写的数据同步工具支不支持 PostgreSQL。

然后跟我讲了他的需求。感觉我随手写的小东西开始变成整个部门的标准方案了。。。这让我有点惶恐。君要臣死,臣不得不死啊。

那么换驱动,兼容不同的sqlsever,mysql 这些都是老生常谈了。无非就是再加上 PostgreSQL 的驱动而已。

但是所有事情要是那么简单就好了。

首先,我们来百度 PostgreSQL 的批量插入。因为是数据同步,所以对性能还是又一定要求的。

当我们在百度上搜索批量插入 自然应该都会找到这篇。

你会发现同样的文章有很多的人转载(抄袭)甚至连个转载声明都没有。唉。很多人创作的心态就是被这些抄袭的人搞炸的。

按照文中的代码段思路,是将泛型List 转换为 DataTable 然后直接使用二进制导入的API导入。

此时我按文中代码实现却抛出了异常。我想该不会是因为文章是2016年的太老了吧。

22021: invalid byte sequence for encoding "UTF8": 0x00

这个百度一下看起来是因为字符的编码问题。我花了一上午来尝试从这个角度解决这个问题,全部无果而终。

这里的心酸和弯路就不提了。

然后我仔细的看了看我 mysql 源库的数据类型和 pgsql 的类型,发现 pgsql 大部分用的是 varcher。也就是我把大部分 mysql bigint 的值写入了 pgsql 的varchar。

结合我在 stackoverflow上看到的零星解释,我觉得和这个也许有些关系。然后我对照 mysql 调整了 pgsql 的字段类型。

本来我都以为要成功了。然后错误变成了:

22P03: incorrect binary data format

我心态要崩了。你说这个谁懂啊!!!我在考虑要不要开一下 pgsql 的日志。

然后我看了看 NpgsqlBinaryImporter 其他的 api。发现注释里写的 WriteRow 方法相当于循环调用 Write 方法。(???这也太

然后看 Write 方法有些重载:

public void Write([AllowNullAttribute] T value, NpgsqlDbType npgsqlDbType);public void Write([AllowNullAttribute] T value, string dataTypeName);

NpgsqlDbType 这个参数引起了我的注意。合着 WriteRow 写一组object。那对应的类型它肯定是取不对的 = =。

此时我的心底燃起了希望之火,那么。我们就换这个api来插入数据,代码如下:

var commandFormat = string.Format(CultureInfo.InvariantCulture, "COPY {0} FROM STDIN (FORMAT BINARY)", TableName);using (var writer = (db.Connection asNpgsqlConnection).BeginBinaryImport(commandFormat))

{foreach (DataRow row indt.Rows)

{

writer.StartRow();foreach (DataColumn coll inrow.Table.Columns)

{var colldbtype =coll.DataType.Name.ToString();

NpgsqlTypes.NpgsqlDbType pgtype=NpgsqlTypes.NpgsqlDbType.Bigint;if (colldbtype.ToLower().Contains("int64")) { pgtype =NpgsqlTypes.NpgsqlDbType.Bigint; }if (colldbtype.ToLower().Contains("string")) { pgtype =NpgsqlTypes.NpgsqlDbType.Varchar; }if (colldbtype.ToLower().Contains("datetime")) { pgtype =NpgsqlTypes.NpgsqlDbType.Date; }

writer.Write(item[coll.ColumnName], pgtype);

}

}

writer.Complete();

ok,成功。

这种方法的重点是 这里计算的 pgtype 与库中的字段格式必须对应。

postgresql批量插入数据脚本_每日踩坑 2020-11-04 PostgreSQL 批量插入数据相关推荐

  1. 摄像头驱动_摄像头驱动程序必需的11个ioctl及摄像头数据的获取过程

    摄像头驱动_摄像头驱动程序必需的11个ioctl及摄像头数据的获取过程 根据虚拟驱动vivi的使用过程彻底分析摄像头驱动 // 1~2都是在v4l2_open里调用 1. open 2. ioctl( ...

  2. 实验室每日一题 2020.11.30

    实验室每日一题 2020.11.30 先打开没有加密的文本文档,里面有一串密文,根据结尾的+推测应该是XXencode,直接找个在线网站解密,又得到一串密文:fwilvyhublqwhuhvwlqj, ...

  3. python 扒数据_不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据

    Python爬虫为什么受欢迎 如果你仔细观察,就不难发现,懂爬虫.学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方面,像 Python这样的编程语言提供越来越多的优秀工具,让爬虫变得 ...

  4. excel处置4000行数据卡_【R语言】5行代码批量合并Excel文件,并增加文件来源列...

    看到一篇文章, 裴帅帅:Python使用9行代码批量合并Excel文件​zhuanlan.zhihu.com 咱们R语言也不能落后啊,5行代码批量合并Excel文件,再多做一步:增加文件来源列. 说是 ...

  5. java数字转大写 其他报异常_【踩坑系列】使用long类型处理金额,科学计数法导致金额转大写异常...

    python科学计算数据应用(第2版) 156.4元 (需用券) 去购买 > 1. 踩坑经历 上周,一个用户反馈他创建的某个销售单无法打开,但其余销售单都可以正常打开,当时查看了生产环境的ERR ...

  6. web数据交互_通过体育运动使用定制的交互式Web应用程序数据科学探索任何数据...

    web数据交互 Most good data projects start with the analyst doing something to get a feel for the data th ...

  7. 政府公开数据可视化_公开演讲如何帮助您设计更好的数据可视化

    政府公开数据可视化 What do good speeches and good data visualisation have in common? More than you may think. ...

  8. python array赋值_从踩坑学Python内部原理(5):执行时机的差异

    (给Python开发者加星标,提升Python技能) 英文:Satwik Kansal,翻译:暮晨 Python开发者整理自 GitHub [导读]:Python 是一个设计优美的解释型高级语言,它提 ...

  9. mysql追溯历史性能问题_【踩坑記錄】記一次MySQL主從復制延遲的坑

    最近開發中遇到的一個MySQL主從延遲的坑,記錄並總結,避免再次犯同樣的錯誤. 情景 一個活動信息需要審批,審批之后才能生效.因為之后活動要編輯,編輯后也可能觸發審批,審批中展示的是編輯前的活動內容, ...

最新文章

  1. 奇点、技术失控与技术启示录
  2. Linux 线程实现机制分析--转
  3. Python 编码规范 TODO注释
  4. bailian 2754八皇后
  5. wp comments post.php,通过修改wp-comments-post.php 防wordpress垃圾(spam)评论 | 沉默过客
  6. Lua_第17 章 数学库
  7. rapidjson读取json文件_SPARK入门 - json文件读取
  8. Doom HDU - 5239(线段树+思维)
  9. OpenCV文档阅读笔记-cvtColor官方解析及实例
  10. 模型秒变API只需一行代码,支持TensorFlow等框架
  11. 一加WarpTen技术今日发布:全新旗舰一加7将搭载
  12. Java编写学生类student程序_编写一个JAVA程序片断定义一个表示学生的类student.docx...
  13. C#用串口接收事件接不全数据的处理
  14. php+模版取余,PHP取余函数介绍MOD(x,y)与x%y_php技巧
  15. keil教程——解压缩BCD码
  16. Java多线程并发面试
  17. 微机期末速通---不挂科版
  18. 陆奇为什么这么值钱? 因为他的原则值钱!
  19. 图像处理之K-Means算法演示
  20. 电脑查看Windows的具体过期日期

热门文章

  1. 1001 A+B Format (20 分)【难度: 简单 / 知识点: 模拟】
  2. 【C/C++】排序算法
  3. Spring boot日志关系
  4. jQuery中Map的使用
  5. jQuery控制表格垂直滚动条
  6. ifix从sqlserver里读数据_ifix连接SQL和读写EXCEL的方法
  7. 限制python内存上限_Python限制内存和CPU使用量的方法(Unix系统适用)
  8. 【PTA】JAVA提交的一些注意点
  9. MySQL的insert into select 引发锁表
  10. 遇到问题:push的时候出现fatal: Authentication failed for