关于GORM v2 的一些改变

举报
小生凡一 发表于 2022/01/09 01:00:02 2022/01/09
【摘要】 文章目录 1. mysql 配置1.2 驱动1.3 连接 2. 读写分离3. 读写验证 目前暂时把gorm v2我用到的与v1不同的一些点放在这里,后续遇到会再更新。 大家不...

目前暂时把gorm v2我用到的与v1不同的一些点放在这里,后续遇到会再更新。

大家不要误以为 V2 版本的Git Tag是 2.x ,其实是 v1.20.0。

1. mysql 配置

1.2 驱动

  • gorm:go get gorm.io/gorm
  • mysql:gorm.io/driver/mysql

1.3 连接

  • 定义一个全局的gorm模型
var DB *gorm.DB

  
 
  • 1
  • 定义全局日志输出
	var ormLogger logger.Interface
	if gin.Mode() == "debug"  {
		ormLogger = logger.Default.LogMode(logger.Info)
	} else {
		ormLogger = logger.Default
	}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 基本配置
	db, err := gorm.Open(mysql.New(mysql.Config{
		DSN: connString, 		// DSN data source name
		DefaultStringSize: 256, 
		// string 类型字段的默认长度
		DisableDatetimePrecision: true, 
		// 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持
		DontSupportRenameIndex: true, 
		// 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
		DontSupportRenameColumn: true, 
		// 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列
		SkipInitializeWithVersion: false, 
		// 根据版本自动配置
	}), &gorm.Config{
		Logger: ormLogger,
		NamingStrategy: schema.NamingStrategy{
			SingularTable:true, // 表不加s
		},
	})

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 其他配置,连接池之类的
	sqlDB, _ := db.DB()
	sqlDB.SetMaxIdleConns(20)  	//设置连接池,空闲
	sqlDB.SetMaxOpenConns(100) 	//打开
	sqlDB.SetConnMaxLifetime(time.Second * 30)
	DB = db

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

2. 读写分离

注意,读写分离的前提是实现了mysql的主从复制,也就是各个节点的数据库之间实现数据一致性

  • 构建mysql连接集群
var Db1Dsn = "root:root@tcp(localhost:3306)/db_ex1?charset=utf8&parseTime=true"
var Db2Dsn = "root:root@tcp(localhost:3306)/db_ex2?charset=utf8&parseTime=true"
var Db3Dsn = "root:root@tcp(localhost:3306)/db_ex3?charset=utf8&parseTime=true"
var Db4Dsn = "root:root@tcp(localhost:3306)/db_ex4?charset=utf8&parseTime=true"

  
 
  • 1
  • 2
  • 3
  • 4
  • 主数据库连接
var DB, _ = gorm.Open(mysql.Open(Db1Dsn), &gorm.Config{} 
// `db1` 作为 sources(DB 的默认连接)

  
 
  • 1
  • 2
  • 配置数据库的读写
_ = DB.Use(dbresolver.
Register(dbresolver.Config{
// `db2` 作为 sources,`db3`、`db4` 作为 replicas
	Sources: []gorm.Dialector{mysql.Open(Db2Dsn)},
	Replicas: []gorm.Dialector{mysql.Open(Db3Dsn), mysql.Open(Db4Dsn)},
	Policy: dbresolver.RandomPolicy{}, // sources/replicas 负载均衡策略
}).
Register(dbresolver.Config{
// `db1` 作为 sources(DB 的默认连接),对于 `User`、`Address` 使用 `db5` 作为
	replicas
	Replicas: []gorm.Dialector{mysql.Open(Db5Dsn)},
}, &User{}, &Address{}).
Register(dbresolver.Config{
// `db6`、`db7` 作为 sources,对于 `orders`、`Product` 使用 `db8` 作为
	replicas
	Sources: []gorm.Dialector{mysql.Open(Db6Dsn), mysql.Open(Db7Dsn)},
	Replicas: []gorm.Dialector{mysql.Open(Db8Dsn)},
}, "orders", &Product{}))

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

sources :主源,主要用来进行 写操作
replicas :次源,主要用来进行 读操作

3. 读写验证

var userStruct UserStruct
// Global Resolver 示例
db.Model(&UserStruct{}).Find(&userStruct,1) // replicas `db3`/`db4`
userStruct.Age=24
db.Save(&userStruct) // sources `db2`

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  1. 当我们是读操作的时候,grom会把我们的读操作作用于 replicas 中。
  2. 当我们涉及写操作,比如 create , update 之类的会从 source 中操作。
  3. 如果没有指定特殊的表进行特殊的操作的话,是默认在没有特殊规定的数据库进行读或是写,比如
    上面例子的 userStruct 是在 db2db3/db4 这三个数据库进行操作

那么就是说读操作的话就是作用在db3或是db4,写操作的话就放在db2

  • db4

在这里插入图片描述

  • db3

在这里插入图片描述

  • db2

在这里插入图片描述

文章来源: blog.csdn.net,作者:小生凡一,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_45304503/article/details/122363997

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。