最近遇到一个比较烧脑的软件项目,得把原本用的微软SQL Server数据库换成PostgreSQL,还得把数据一起搬家。这事说起来简单,但真做起来,才发现有点麻烦。
首先想到的,自然是找找有没有现成的搬迁方案。网上倒是有一些方法推荐,比如通过sql文件的方式,不过百度一圈后发现,这不是个简单活。我这个项目里可是有上百个表格,动辄成千上万条记录,想靠csv或txt的方式导来导去,恐怕只会折腾得我怀疑人生。
心想这不行,就去网上搜了搜,有个叫DBConvert Studio的工具,名声倒是很好,能在各种主流数据库之间进行转换。但人家是收费的,我折腾半天也没找到免费方法,小众工具嘛,破解都没人愿意搞。
算了,扛不住就自己上。心里琢磨着,”看着也不是什么特别复杂的事”,大不了自己写个小工具,把旧数据库的数据顺次搬到新库里。不过,真干起来才知道,光拼接SQL语句就折腾了一晚上,更别提各种数据类型之间的转换了,折磨得我脑壳痛。
我用的是.NET Core框架,牵涉到复杂的类型转换:先是SQL Server的数据类型转成.NET格式,再转成PostgreSQL的格式。打个比方,我在C#里用的GUID格式,在SQL Server里是uniqueidentifier,但在PostgreSQL中则是uuid。这中间转换得没完没了。
再加上像bool类型这种,在SQL Server和PostgreSQL里都是用bit存的,但转来转去,还得先搞成int32格式。不仅烦,还得小心。
就这样摸爬滚打一段时间后,心里话,熬不下去还得想捷径。灵光一闪,既然有通用的数据库管理工具,或许可以借力用在这上面。我试了下老朋友Navicat,果然,在“工具”菜单里找到了“数据传输”选项,基本上就是我想要的。
它能让我先配置好连接信息,然后选择要迁移的表,挺方便的。不过做事要小心,迁移前有个选项是问是否删除目标表中的同名表和迁移外键,最好别勾选,避免不必要的麻烦。万一整出啥事儿,还得事后去手动调整。
等数据完整迁移后,自然需要进行数据类型的检查和手动调整。拿我.NET Core开发的程序来说,用的是Npgsql.EntityFrameworkCore.PostgreSQL的ORM工具,在手册上找到了.NET Core和PostgreSQL的数据类型对照表,按图索骥检查看看有哪些需要调整的,比如uuid有可能直接被转成varchar。
在迁移过程中,我还留意到了bool类型从SQL Server的bit变成了PostgreSQL中的短整型Int16,而Npgsql处理不了这个,得手动修改成bool。这里有个小技巧,先从Int16转Int32,再转成bool,就搞定了。
并且,最后需要在代码里更新数据库连接字符串,还有ORM工具,从Microsoft.EntityFrameworkCore.SqlServer换成Npgsql.EntityFrameworkCore.PostgreSQL。
这样的折腾虽说麻烦,不过自己在最初编写转换工具时的摸索也不是完全没用,它让我更加熟悉了两种数据库和.NET Core的数据类型关系,这也为后续新数据库的字段调整打下了基础。虽然这个过程像掉进了无底深渊,好在结果还是让人挺满意。
本站资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。如有侵权请发送邮件至vizenaujmaslak9@hotmail.com删除。:FGJ博客 » 将SQL Server数据迁移至PostgreSQL思路