把 SQL Server 数据内容迁移到 PostgreSQL
最近手里有个正在开发的软件项目需要把此前用的微软的 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 字段类型奠定了基础。
留言评论