在本篇文章中,我们将重点从Golang与国产数据库(达梦)适配的角度来讲述如何选型适配方案以及精鲲在国产数据库(达梦)适配过程的做法及注意点,希望对这方面有诉求的同学可以有帮助。

首先,我们先交代下背景,精鲲的应用软件涉及业务自动化多个产品模块,主要包括:数字化服务管理、自动化执行流编排、自动化数据流编排和数据可视化分析交互。为更好地统一集中管理各类产品模块,精鲲推出了统一门户的概念。作为提供标准化能力的统一门户,自然需要提供高可用的配置化方案来解决国产数据库的适配问题。同时我们要求整体方案需要遵循以下宗旨:

  • 始终只维护一套代码
  • 选型不同数据库的适配与代码实现无关
  • 通过配置化参数,研发工程可适配不同的数据库类型

基于以上三个宗旨标准,本篇文章我们以国产数据库(达梦)和广泛使用的关系型数据库MySQL的适配过程为例,讲述精鲲如何解决Golang与国产数据库的适配问题。

适配方案选型

精鲲统一门户选用腾讯社区主理的GO框架GoFrame作为研发的标准框架。同时ORM层也是选用GoFrame的gdb作为数据库引擎。在此前提之下,若选用达梦官方推荐的GO版ORM驱动引擎zorm,则需要替换原数据库驱动,重构所有的数据层代码。这明显是不符合实际的解决方案。工程回炉重造造成的人力成本浪费,代码工程不稳定都会引起次生的问题。

当回头重构的方案不是明智选择时,我们只能用创新直面问题,从驱动根源上解决问题。那么最佳的方案就是向GoFrame框架社区直接提供解决方案,增加达梦数据库编写新ORM驱动,使其支持达梦数据库。当新ORM驱动完成后,对于精鲲而言,数据库上层业务使用的各种方法操作不用变化,只需要修改配置中的数据库类型即可切换支持到新的数据库,使得程序对于不同类型的数据库可以自动完成适配。同时也可以向GoFrame框架社区提供扩展能力,为国产数据库、国产代码框架丰富更多的能力项和推广。

而面对新ORM驱动的编写需要具有较高的技术门槛,精鲲技术花费约两周的时间摸清了整体的设计思路并顺利的完成了达梦ORM驱动的编写。下面和大家分享一下如何去进行ORM的驱动开发。

ORM接口分析

我们可以从gdb 源码 中分析出整个模块使用了非常灵活且扩展性强的接口设计。这种接口设计是允许开发者可以非常方便地自定义实现和替换接口定义中的任何方法。在gdb模块中最为核心接口是DB接口,也是我们通过ORM操作数据库时最常用的接口。这里主要对接口的几个重要方法做说明:

  • Open方法用于创建特定的数据库连接对象,返回的是标准库的*sql.DB通用数据库对象。
  • Do*系列方法的第一个参数link为Link接口对象,该对象在master-slave模式下可能是一个主节点对象,也可能是从节点对象,因此如果在继承的驱动对象实现中使用该link参数时,注意当前的运行模式。slave节点在大部分的数据库主从模式中往往是不可写的。
  • HandleSqlBeforeCommit方法将会在每一条SQL提交给数据库服务端执行时被调用做一些提交前的回调处理。
  • 其他接口方法详见接口文档或者源码文件。

我们绘制出在整个GoFrame框架下ORM引擎DB接口关系图

ORM驱动开发

开发者自定义的驱动需要实现以下Driver接口:

其中的`New`方法用于根据`Core`数据库基础对象以及`ConfigNode`配置对象创建驱动对应的数据库操作对象,需要注意的是,返回的数据库对象需要实现`DB`接口。而数据库基础对象`Core`已经实现了`DB`接口,因此开发者只需要“继承”`Core`对象,然后根据需要覆盖对应的接口实现方法即可。

在实现该接口之后,我们可以通过以下方法注册自定义驱动到`gdb`模块:

其中的驱动名称`name`可以是已有的驱动名称,例如`mysql`, `mssql`, `pgsql`等等,当出现同名的驱动注册时,新的驱动将会覆盖老的驱动。

开发一个自定义的驱动并注册到`gdb`模块中非常简单,可以参考`gdb`模块源码中已对接的数据库类型代码示例:https://github.com/gogf/gf/tree/master/contrib/drivers

需要说明的是,最常见的驱动开发或者修改方式是直接继承于现有`*Core`类型,因为在`Driver`接口中会传递该类型的对象,例如:

以上这种框架数据库组件的驱动意义在于,数据库上层业务使用的各种方法操作不用变化,只需要修改配置中的数据库类型即可切换支持到新的数据库。

我们可以通过数据库组件的接口设计实现:新增框架默认不支持的第三方数据库驱动、对已有支持的驱动进行定制化修改等。驱动的开发并不是完整地开发一类数据库的协议实现代码,而是使用第三方已有的数据库驱动,通过实现框架数据库组件的接口,将该第三方数据库驱动对接到框架数据库组件上来,保证上层操作的一致。

参考文献

  • 达梦ORM适配器
  • GoFrame框架社区
  • GoFrame官方文档
  • GoFrame官方活动

2022-09-14 ORM驱动开发直播分享