golang sqlite主从数据同步插件开发

复制代码
### golang sqlite主从数据同步插件开发

思路

参考Mysql的主从同步机制,Mysql是产生binlog,然后把binlog日志同步到从服务上。

同理,我们按sql执行顺序记录所有的增删改查的sql语句,然后调用接口把sql语句传到从服务上执行。

数据库驱动使用的是 GORM。

编写gorm插件

golang 复制代码
type Plugin interface {
	Name() string
	Initialize(*gorm.DB) error
}
type TracePlugin struct {
}

func (op *TracePlugin) Name() string {
	return "tracePlugin"
}

func (op *TracePlugin) Initialize(db *gorm.DB) (err error) {

	// 在这些sql操作后执行after方法,只记录增 删 改的语句
	_ = db.Callback().Create().After("gorm:after_create").Register("after_create", after)
	_ = db.Callback().Delete().After("gorm:after_delete").Register("after_delete", after)
	_ = db.Callback().Update().After("gorm:after_update").Register("after_update", after)
	return
}

func after(db *gorm.DB) {
	
	err := db.Error
	//sql执行成功
	if err == nil {
		//获取sql
		sql := db.Dialector.Explain(db.Statement.SQL.String(), db.Statement.Vars...)
		if strings.Contains(sql, "refresh_token") {
			//过滤不需要的sql
			return
		}
		//远程调用执行sql语句
		sendExecSql(sql)

	}

	return
}

使用插件

golang 复制代码
var SqliteDb *gorm.DB

func init() {
	var err error
	SqliteDb, err = gorm.Open(sqlite.Open("sqlite.db"), &gorm.Config{
		NamingStrategy: schema.NamingStrategy{
			SingularTable: true, // 不要复数表名
		},
		Logger:      logger.Default.LogMode(logger.Info), // 打印 SQL 语句
		PrepareStmt: true,
	})
	if err != nil {
		fmt.Printf("connect DB failed, err:%v\n", err)
		return
	}
	fmt.Println("connect DB success")
	

	db, err := SqliteDb.DB()
	// 空闲状态下的最大连接数,默认的最大空闲连接数为2
	db.SetMaxIdleConns(10)
	// 最大打开连接数, 默认值为0(无限制)
	db.SetMaxOpenConns(100)
	// 设置连接可以重复使用的最长时间
	db.SetConnMaxLifetime(time.Hour)
	

	//使用插件
	SqliteDb.Use(&plugins.TracePlugin{})
}

注意

sql要按顺序发送给从库执行,执行后要返回结果,返回成功后在发送下一条执行。

参考链接:

https://gorm.io/zh_CN/docs/write_plugins.html

https://studygolang.com/articles/32886?fr=sidebar

相关推荐
花酒锄作田6 天前
Gin 框架中的规范响应格式设计与实现
golang·gin
百锦再6 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip
qwfys2006 天前
How to install golang 1.26.0 to Ubuntu 24.04
ubuntu·golang·install
kangzerun6 天前
SQLiteManager:一个优雅的Qt SQLite数据库操作类
数据库·qt·sqlite
用户5757303346246 天前
AIGC 时代数据库革命:告别手写 SQL,用自然语言驾驭 SQLite
sqlite
codeejun6 天前
每日一Go-25、Go语言进阶:深入并发模式1
开发语言·后端·golang
石牌桥网管6 天前
Go 泛型(Generics)
服务器·开发语言·golang
小二·6 天前
Go 语言系统编程与云原生开发实战(第21篇)
开发语言·云原生·golang
小二·6 天前
Go 语言系统编程与云原生开发实战(第20篇)
开发语言·云原生·golang
女王大人万岁6 天前
Golang实战Eclipse Paho MQTT库:MQTT通信全解析
服务器·开发语言·后端·golang