记一次sqlserver转postgresql的百万数据量的导入任务

463 阅读2分钟

先简单插个眼,后面有空再补完。(原先在思否记的笔记,但是发现突然不支持编辑了,好像有问题,还是转到文章里来吧,好整写)

导入任务

对方提供的脚本是批量INSERT 的脚本,需要这些数据的这个项目的是 PostgreSql
先看看 对方的脚本长啥样

//注:库名和表名和数据都处理了,参考的话可以自己对照着改改
USE [DB]
GO
/****** Object:  Table [dbo].[tablename]    Script Date: 06/29/2021 19:06:21 ******/
SET IDENTITY_INSERT [dbo].[tablename] ON
INSERT [dbo].[tablename] ([id], [name], [sex], [dob], [card_no], [other_id], [contact_addr], [height], [weight], [age], [identity_no], [phone_no], [remark]) VALUES (4059, N'张三', 2, CAST(0x00009E0E0095524F AS DateTime), N'000000999999', N'151515151515', N'', N'', N'', N'', N'                  ', NULL, N'233233')

以此类推
数据量约400多万

本来想直接执行到本地的sqlserver再导出成csv / txt 再导入到postgresql

跨库的 '时间转换支持' 问题

可是 遇到
ERROR: invalid byte sequence for encoding "UTF8": 0xc9e3

Postgresql的底层字符集跟C是一样的,它的UTF8不支持末尾加'\0'的写法。
由于目前Postgresql中官方解释Postgresql对于0x00和\u0000无法支持,必须进行替换。

黔驴技穷,尤其是看到这个CAST的时候,要实现 0x00009E0E0095524F 转换成 2010-10-13 09:03:39 感觉不太可能直接丢给postgresql去执行了

但是,我花了一晚上成功用python脚本给他改能用了哈哈哈,记录下,代码后面再传
修改后,也就是我们需要的样子是:

INSERT into tablename (id, name, sex, dob, card_no, other_id, contact_addr, height, weight, his_age, identity_no, phone_no, remark) VALUES (4059, '张三', 1, CAST('2010-10-13 09:03:39' AS TimeStamp), '00000099999', '151515151515', '', '', '', '', '                  ', NULL, '233233');

其他的都replace掉,时间要好好转化下。先简单说下,后面补充:sqlserver时间从1970算起,所以这个编码分前四字节和后四字节,分别16转10,分别得到day数和毫秒/秒数,(这个根据字节长度区分的)根据毫秒数生成时间,然后再把天数加上,就可以了。

关于运行效率

代码

有空传下,在我的jupyter notebook 上 有人看的话,可以催下我(假装有人看)