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

相关推荐
Generalzy6 小时前
从本地 Demo 到生产级检索:Milvus 学习笔记(2)
golang·milvus
张32310 小时前
Go语言基础 Map 函数值 闭包
开发语言·golang
北冥you鱼11 小时前
Go Modules 使用指南:从入门到精通
开发语言·后端·golang
灯澜忆梦11 小时前
【dp_1】爬楼梯 | 斐波那契数 | 第 N 个泰波那契数 | 三步问题
算法·golang
geovindu12 小时前
go: Floyd-Warshall Algorithms
开发语言·后端·算法·golang
Quincy_Freak1 天前
Python 轻量化数据存储实践:国产化环境下SQLite高效管理方案
数据库·sqlite·数据库管理·大数据分析·sqlitego
大侠锅锅1 天前
第 9 篇:状态机实践——状态环 + 步进表替代 if-else 地狱
golang·边缘计算·状态机
灯澜忆梦1 天前
iota枚举
golang
进击的程序猿~2 天前
Go Slice源码深度解析指南
开发语言·后端·golang
北冥you鱼2 天前
Go 语言初始化 MySQL 数据库实战指南:从零到生产环境部署
数据库·mysql·golang