Administrator
Administrator
发布于 2025-08-12 / 22 阅读
0
0

golang中gorm的读写分离

gorm是golang的orm框架。

读写分离的前提是数据库实现了主从复制,依赖相关文档:https://gorm.io/docs/dbresolver.html

安装依赖

go get gorm.io/driver/mysql #MYSQL驱动
go get gorm.io/gorm #GORM框架
go get gorm.io/plugin/dbresolver #gorm的插件

代码

Register时支持指定哪些表用哪些数据库去做读写,在上面的文档地址中有示例,通过Register的链式调用。

Policy:

  • RandomPolicy:完全随机使用

  • RoundRobinPolicy:依次使用列表中的连接,循环使用

  • StrictRoundRobinPolicy:判断健康程度选择使用哪个连接

package main

import (
	"fmt"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/plugin/dbresolver"
)

func main() {
	primaryDsn := "root:123456@tcp(127.0.0.1:23306)/local_db"
	slaveDsn := "root:123456@tcp(127.0.0.1:23307)/local_db"
	db, _ := gorm.Open(mysql.Open(primaryDsn))

	db.Use(dbresolver.Register(dbresolver.Config{
		Sources:           []gorm.Dialector{mysql.Open(primaryDsn)}, //主库
		Replicas:          []gorm.Dialector{mysql.Open(slaveDsn)}, //从库
		Policy:            dbresolver.RandomPolicy{},
		TraceResolverMode: true, //debug中显示[source]或[replica]
	}))

	var count int64
	db.Debug().Table("users").Count(&count)
	fmt.Print(count)

	db.Debug().Table("users").Create(map[string]any{
		"username": "44",
		"password": "44444",
	})

}


评论