百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

记一次把 SQL Server 迁移到 PostgreSQL 操作

suiw9 2024-11-26 08:38 12 浏览 0 评论

最近手里有个正在开发的软件项目需要把此前用的微软的 SQL Server 数据库修改为 PostgreSQL ,同时,要把里面的数据一并迁移过去。

如果不考虑开发和当前正在进行的软件开发工作兼容性,应该有不少迁移方法,我在网上也有搜索到,比如通过 sql 文件。

如果表(数据)不是很多的话,还可以考虑采用通过从 SQL Server 中将数据导出为csv、txt文件,再导入到PostgreSQL 中的方法。

不过,我这个项目有100多个表了,而且有些表中的数据量还蛮多,数万条记录,通过文中导入导入导出的方法不太可行了。

于是我搜到了网上一个叫 DBConvert Studio 的软件,它号称可以对各种主流数据库进行互相转换。但是它是一款付费软件,我折腾许久也没有找到一个破解好的免费版本,可能是一个小众工具,没有人去做破解工作。

我想,一时没有合适的工具就自己写一个吧,反正“看上去似乎也不是复杂”,就是从旧数据库依次读取数据,然后插入到新的数据库中。写了一会发现,这似乎不是那么简单,拼接SQL语句就折腾了我一个晚上,还有数据类型转换,更是头大。

因为我使用的是.NET Core 框架,还涉及到两步数据类型转换,即:

SQL Server 数据类型 → .NET Core 框架格式 → PostgreSQL 的数据类型。

比如 C# 中的GUID格式,在 SQL Server 中是的 uiniquideter,在PostgreSQL 中是uuid,我用程序要中转的时候,要当成文本格式处理。

还有程序设计中常用的boolen格式,在 SQL Server 和 PostgreSQL 中都是以bit形式(0和1)存储的,但是在编写转换工具的时候,要转成 int32 格式传输。

至于日期格式,C#中是DateTime,在SQL Server中是datetime2,在PostgreSQL中是带时区信息的timestamptz以不带时区信息的timestamp两种格式。

我感觉像是掉进了一个漩涡,没有多少时间去雕琢这个数据库转换工具软件,如果花时间去逐个类型编写处理逻辑,最后应该是可以写出一个软件的,但是我的需求只是想迁移一个数据库而已。

就在一筹莫展的时候,我想到一些通用的数据库图形化管理工具,既然他们是“通用”的,那么它们估计也能进行数据迁移?

我点开了常用的Navicat,果然,在菜单栏的“工具”下有个“数据传输”的选项,点开后,似乎就是我想要的功能,甚至可以说,涵盖了此前的DBConvert Studio 的功能。

左侧是源数据库信息,右侧是目标数据库信息。

选择配置好的连接信息和数据库后,点击下一步,选择要迁移的表,一般是全选,在这里应该也可以勾选指定几个表进行迁移。

在这个页面有个选项按钮,点击后可以设置在迁移前是不是要删除目标数据库中已有的同名表和同时迁移外键等配置项。

外键这个配置我建议不要勾选,不然有些约束会导致数据无法导入,如果需要的话,可以事后手动添加。

确认选项无误后,点击确定和下一步就可以点击开始进行数据迁移传输了。

数据迁移完成后,还要进行数据类型检查手动调整的工作。

我程序是 .NET Core 框架开发的,ORM工具是 Npgsql.EntityFrameworkCore.PostgreSQL ,在 Npgsql 的网站上有 .Net Core 数据类型和 PostgreSQL 数据类型的映射关系表:

Supported Types and their Mappings | Npgsql Documentation

通过这个表和迁移完成的数据库比对发现Navicat在转换的时候还是有些类型差异的,需要手动调整过来,比如uuid被转换varchar。

需要注意的是 bool 类型因为在SQL Server 中是bit格式存储的,迁移过来的后被转成短整型Int16的,Npgsql无法将其转成bool,需要修改成bool,但是 PosgreSQL 数据库不允许一步将Int16修改为bool,原因我也不知道,不过有个方法是先将Int16转成Int32,保存后,再将Int32设置成bool类就可以了。

然后修改代码中的数据库连接字符串以及ORM工具,即将 Microsoft.EntityFrameworkCore.SqlServer 修改为 Npgsql.EntityFrameworkCore.PostgreSQL 。

至此,全面完成了数据库转换迁移。

早些时候的自己编写转换工具的工作并不是没有价值的,那个过程让我熟悉了两种数据库和.Net Core 的类型对应关系,为在后面调试程序,修改新数据库PostgreSQL字段类型奠定了基础。

相关推荐

10款超实用JavaScript音频库(js播放音频代码)

HTML5提供了一种新的音频标签实现和规范用一个简单的HTML对象而无需音频插件来控制音频。这只是一个简单的整合这些新的HTML5音频特征及使用JavaScript来创建各种播放控制。下面将介绍10款...

Howler.js,一款神奇的 JavaScript 开源网络音频工具库

o...

PROFINET转Modbus网关——工业协议融合的智能枢纽

三格电子SG-PNh750-MOD-221,无缝连接Profinet与Modbus,赋能工业物联产品概述...

简单实用的Modbus类库,支持从站和DTU

一、简介...

[西门子PLC] S7-200 SMART PROFINET :通过GSD组态PLC设备

从S7-200SMARTV2.5版本开始,S7-200SMART开始支持做PROFINETIO通信的智能设备。从而,两个S7-200SMART之间可以进行PROFINETI...

Modbus(RTU / TCP)有什么异同(modbus tcp和tcp)

Modbus是一种广泛使用的工业自动化通信协议,它支持设备之间的数据交换。Modbus协议有两个主要的变体:ModbusRTU(二进制模式)和ModbusTCP(基于TCP/IP网络的模式)。尽管...

Modbus通信调试步骤详解(modbus调试工具怎么用)

Modbus通信调试步骤详解  Modbus通信分为串口和以太网,无论是串口还是以太网,只要是标准Modbus,就可以用Modbus模拟器进行调试。按以下几步进行调试。...

理解Intel手册汇编指令(intel 汇编指令手册)

指令格式...

「西门子PLC」S7-200 SMART的Modbus RTU通讯

S7-200SMART集成的RS485端口(端口0)以及SBCM01RS485/232信号板(端口1)两个通信端口可以同时做MODBUSRTU主站,或者一个做MODBUSRTU主站一个做MO...

InfiniBand网络运维全指南:从驱动安装到故障排查

一、InfiniBand网络概述InfiniBand(直译为“无限带宽”技术,缩写为IB)是一种用于高性能计算的计算机网络通信标准,具有极高的吞吐量和极低的延迟,用于计算机与计算机之间的数据互连。它...

一加回归 OPPO,背后的秘密不可告人

有这样一个手机品牌,它诞生于互联网品牌。在大众群体看来,它的身世似乎模糊不清,许多人以为它是国外品牌。它的产品定位是极客群体,深受国内发烧友,甚至国外极客玩家喜爱。...

[西门子PLC] S7-200SMART快速高效的完成Modbus通信程序的设计

一、导读Modbus通信是一种被广泛应用的通信协议,在变频器、智能仪表还有其他一些智能设备上都能见到它的身影。本文呢,就把S7-200SMART系列PLC当作Modbus主站,把...

狂肝10个月手搓GPU,他们在我的世界中玩起我的世界,梦想成真

梦晨衡宇萧箫发自凹非寺量子位|公众号QbitAI自从有人在《我的世界》里用红石电路造出CPU,就流传着一个梗:...

[西门子PLC] 博途TIA portal SCL编程基础入门:1-点动与自锁

一、S7-SCL编程语言简介...

工作原理系列之:Modbus(modbus工作过程)

MODBUS是一种在自动化工业中广泛应用的高速串行通信协议。该协议是由Modion公司(现在由施耐德电气公司获得)于1979年为自己的可编程逻辑控制器开发的。该协议充当了PLCS和智能自动化设备之间的...

取消回复欢迎 发表评论: