目前暂时把gorm v2我用到的与v1不同的一些点放在这里,后续遇到会再更新。
大家不要误以为 V2 版本的Git Tag
是 2.x ,其实是 v1.20.0。
go get gorm.io/gorm
gorm.io/driver/mysql
var DB *gorm.DB
var ormLogger logger.Interface
if gin.Mode() == "debug" {
ormLogger = logger.Default.LogMode(logger.Info)
} else {
ormLogger = logger.Default
}
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
},
})
sqlDB, _ := db.DB()
sqlDB.SetMaxIdleConns(20) //设置连接池,空闲
sqlDB.SetMaxOpenConns(100) //打开
sqlDB.SetConnMaxLifetime(time.Second * 30)
DB = db
注意,读写分离的前提是实现了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"
var DB, _ = gorm.Open(mysql.Open(Db1Dsn), &gorm.Config{}
// `db1` 作为 sources(DB 的默认连接)
_ = 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{}))
sources
:主源,主要用来进行 写操作
。
replicas
:次源,主要用来进行 读操作
。
var userStruct UserStruct
// Global Resolver 示例
db.Model(&UserStruct{}).Find(&userStruct,1) // replicas `db3`/`db4`
userStruct.Age=24
db.Save(&userStruct) // sources `db2`
replicas
中。create
, update
之类的会从 source
中操作。userStruct
是在 db2 和 db3/db4 这三个数据库进行操作那么就是说读操作的话就是作用在db3或是db4,写操作的话就放在db2