Gorm_Sharding入门

Sharding

Sharding 是一个高性能的 Gorm 分表中间件。它基于 Conn 层做 SQL 拦截、AST 解析、分表路由、自增主键填充,带来的额外开销极小。对开发者友好、透明,使用上与普通 SQL、Gorm 查询无差别,只需要额外注意一下分表键条件。 为您提供高性能的数据库访问。

https://github.com/go-gorm/sharding

功能特点

  • 非侵入式设计, 加载插件,指定配置,既可实现分表。
  • 轻快, 非基于网络层的中间件,像 Go 一样快
  • 支持多种数据库。 PostgreSQL 已通过测试,MySQL 和 SQLite 也在路上。
  • 多种主键生成方式支持(Snowflake, PostgreSQL Sequence, 以及自定义支持)Snowflake 支持从主键中确
func InitDB() {
	//配置MySQL连接参数
	username := "root"    //账号
	password := "123456"  //密码
	host := "127.0.0.1"   //数据库地址,可以是Ip或者域名
	port := 3306          //数据库端口
	Dbname := "gin_study" //数据库名
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", username, password, host, port, Dbname)
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
		Logger: logger.Default.LogMode(logger.Info),
	})
	if err != nil {
		panic("连接数据库失败, error=" + err.Error())
	}
	db.Use(sharding.Register(sharding.Config{
		ShardingKey:         "user_id",
		NumberOfShards:      4,
		PrimaryKeyGenerator: sharding.PKSnowflake, //主键生成规则,这里面雪花算法
	}, "orders"))
	global.DB = db
}

依然保持原来的方式使用 db 来查询数据库。 你只需要注意在 CURD 动作的时候,明确知道 Sharding Key 对应的分表,查询条件带 Sharding Key,以确保 Sharding 能理解数据需要对应到哪一个子表。

package test

import (
	"GinStudy/helloworld/global"
	"GinStudy/helloworld/inition"
	"GinStudy/helloworld/model"
	"GinStudy/helloworld/service"
	"fmt"
	"testing"
)

func init() {
	inition.InitDB()
}
func TestCreateOrders(t *testing.T) {
	ordersInsert := model.Orders{
		UserId:    10,
		ProductID: 25,
	}
	service.OrderService{}.CreateOrder(ordersInsert)

	// 原生 SQL 插入示例,这会插入到 orders_03 表
	global.DB.Exec("INSERT INTO orders(user_id,product_id) VALUES(?,?)", int64(3), int64(5))

	// Find 方法,这会检索 order_02 表
	var orders []model.Orders
	global.DB.Model(&model.Orders{}).Where("user_id", int64(2)).Find(&orders)
	fmt.Printf("%#v\n", orders)
	fmt.Println(orders)
}

在这里插入图片描述

在这里插入图片描述

查询的结果如下:

在这里插入图片描述

  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值