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

相关推荐
资深web全栈开发2 小时前
[特殊字符]图解 Golang 反射机制:从底层原理看动态类型的秘密
开发语言·后端·golang
l1t9 小时前
利用DeepSeek改写SQLite版本的二进制位数独求解SQL
数据库·人工智能·sql·sqlite
Tony Bai9 小时前
【Go模块构建与依赖管理】09 企业级实践:私有仓库与私有 Proxy
开发语言·后端·golang
Lucky小小吴10 小时前
开源项目5——Go版本快速管理工具
开发语言·golang·开源
进化中的码农10 小时前
Go中的泛型编程和reflect(反射)
开发语言·笔记·golang
apocelipes13 小时前
POSIX兼容系统上read和write系统调用的行为总结
linux·c语言·c++·python·golang·linux编程
童话ing13 小时前
【Golang】常见数据结构原理剖析
数据结构·golang
Wzx1980121 天前
go基础语法练习
开发语言·后端·golang
RedJACK~1 天前
Go Ebiten小游戏开发:扫雷
开发语言·后端·golang