开源软件 for Huawei 之 GORM 操作华为云数据库 GaussDB 攻略【最终章】
背景介绍
GORM(https://gorm.io) 是一个强大的 Go 编程语言中的 ORM 库,具有简单易用、多数据库支持、自动迁移、事务支持和强大的查询功能等特点。
华为云数据库 GaussDB(https://support.huaweicloud.com/gaussdb/index.html) 是华为自主创新研发的分布式关系型数据库。该产品具备企业级复杂事务混合负载能力,同时支持分布式事务,同城跨AZ部署,数据0丢失,支持1000+的扩展能力,PB级海量存储。同时拥有云上高可用,高可靠,高安全,弹性伸缩,一键部署,快速备份恢复,监控告警等关键能力。
开发思路
GORM 框架为了适配不同的数据库,抽象出了一个中间接口层 Dialector,只要数据库的驱动实现了该接口,就可以确保 GORM 生成特定数据库特性的 SQL。详见GORM项目文档:Write Driver(https://gorm.io/docs/write_driver.html)
因此,如果要实现 GORM 操作 GaussDB 数据库,我们就需要开发一个 Dialect 中间接口层,或者使用其它已有的 Dialect 中间层,然后注册 GaussDB 数据库驱动类。
具体实现
- 自定义 GORM 驱动,自己实现 Dialect 接口,然后底层使用 GaussDB 数据库驱动类。
具体实现详见:gorm4gaussdb
示例代码:
import (
gaussdb "github.com/okyer/gorm4gaussdb"
"gorm.io/gorm"
)
dsn := "host=127.0.0.1 user=test password=123456 dbname=test port=8000 sslmode=disable TimeZone=Asia/Shanghai"
db, err := gorm.Open(gaussdb.Open(dsn), &gorm.Config{})
if err != nil {
panic(err)
}
- 使用已有的 postgres GORM 驱动,然后通过设置 DriverName 来切换到 GaussDB 数据库驱动类。
通过分析 postgres GORM 驱动代码可知,在配置 postgres 驱动时,如果指定了 DriverName 就会直接使用该数据库驱动类,否则再加载 PostgreSQL 数据库驱动类。这就为我们提供了一套嫁衣,让我们使用 postgres GORM 驱动来操作 GaussDB 数据库驱动类。
示例代码:
import (
_ "gitee.com/opengauss/openGauss-connector-go-pq"
"gorm.io/driver/postgres"
"gorm.io/gorm"
)
dsn := "host=127.0.0.1 user=test password=123456 dbname=test port=8000 sslmode=disable TimeZone=Asia/Shanghai"
db, err := gorm.Open(postgres.New(postgres.Config{DriverName: "opengauss", DSN: dsn}), &gorm.Config{})
if err != nil {
panic(err)
}
另外,如果我们要使用从华为云数据库 GaussDB 官网下载 的驱动压缩包时,需要在 go.mod 中使用 replace 替换到本地包。该下载版的驱动类中,在开源版驱动的基础上,在创建数据库连接时多注册了“postgres”和“postgresql”这两个驱动名称。
示例代码:
// replace gitee.com/opengauss/openGauss-connector-go-pq => ./openGauss-connector-go-pq
import (
_ "gitee.com/opengauss/openGauss-connector-go-pq"
"gorm.io/driver/postgres"
"gorm.io/gorm"
)
dsn := "host=127.0.0.1 user=test password=123456 dbname=test port=8000 sslmode=disable TimeZone=Asia/Shanghai"
db, err := gorm.Open(postgres.New(postgres.Config{DriverName: "postgres", DSN: dsn}), &gorm.Config{})
if err != nil {
panic(err)
}
GORM 操作 GaussDB 应用示例:https://gitcode.com/stanley2024/gorm-for-gaussdb
编写 Demo 微服务
为了在微服务开发中使用 GORM 来操作 GaussDB 数据库,在编写 Demo 微服务时我使用 go-zero(https://go-zero.dev/) 框架来实现 RESTful 接口服务。go-zero 是一个集成了各种工程实践的 web 和 rpc 框架。通过弹性设计保障了大并发服务端的稳定性,经受了充分的实战检验。
Demo 参考地址:(https://gitcode.com/HuaweiCloudDeveloper/OpenSourceForHuaweiDemoGo)
Demo 微服务架构:
Demo 开发完成以后,我使用华为云的软件开发生产线 CodeArts 来构建这个 Demo 服务,具体方法可以参考:
- 点赞
- 收藏
- 关注作者
评论(0)