go&mysql

链接mysql


package main

import (
	"time"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"gorm.io/gorm/schema"
	"gorm.io/plugin/dbresolver"
)

var _db *gorm.DB

func main() {
	pathR := "root:12345@(127.0.0.1:3306)/hcl1?chartset=utf8&parseTime=true"
	pathW := "root:12345@(127.0.0.1:3306)/hcl2?chartset=utf8&parseTime=true"

	ormLoger := logger.Default
	db, _ := gorm.Open(mysql.New(mysql.Config{
		DSN:                       pathR,  // source name
		DefaultStringSize:         256,   // string 类型字段的默认长度
		DisableDatetimePrecision:  true,  // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持
		DontSupportRenameIndex:    true,  // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
		DontSupportRenameColumn:   true,  // 不支持重命名列
		SkipInitializeWithVersion: false, // 根据版本自动配置
	}), &gorm.Config{
		Logger: ormLoger,
		NamingStrategy: schema.NamingStrategy{ // 命名策略
			SingularTable: true,
		},
	})
	sqlDB, _ := db.DB()
	sqlDB.SetMaxIdleConns(20)                  //设置连接池,允许最大空闲数量
	sqlDB.SetMaxOpenConns(100)                 //允许最大打开数量
	sqlDB.SetConnMaxLifetime(time.Second * 30) // 过期时间
	_db = db
	// 主从配置 (dbresolver是主从配置插件)
	_db.Use(dbresolver.
		Register(dbresolver.Config{
			// `db1` 作为 sources,`db2`、`db3` 作为 replicas
			Sources:  []gorm.Dialector{mysql.Open(pathW)},                    // 写操作
			Replicas: []gorm.Dialector{mysql.Open(pathR), mysql.Open(pathR)}, // 读操作
			Policy:   dbresolver.RandomPolicy{},                              // sources/replicas 负载均衡策略
		}))
    Migration()
}

func NewDBClient(ctx context.Context) *gorm.DB {
	db := _db 
	return db.WithContext(ctx)
}

数据迁移

// 自动迁移 
// 执行数据迁移 utf8mb4是utf8的超集,mb4是专门来兼容四字节的unicode,mysql只支持utf8最大字符长度为3字节,如果遇到4字节的宽字符就会插入异常了。
func Migration() {
	err := _db.Set("gorm:table_options", "charset=utf8mb4").AutoMigrate(
		&model.User{},
		&model.Product{},
	)
	if err != nil {
		log.Println("register table fail")
		os.Exit(0)
	}
	log.Println("register table success")
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值