教程 > gorm 教程 > 阅读:214

gorm sharding——迹忆客-ag捕鱼王app官网

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

功能特点

  • 非侵入式设计, 加载插件,指定配置,既可实现分表。
  • 轻快, 非基于网络层的中间件,像 go 一样快
  • 支持多种数据库。 postgresql 已通过测试,mysql 和 sqlite 也在路上。
  • 多种主键生成方式支持(snowflake, postgresql sequence, 以及自定义支持)snowflake 支持从主键中确定分表键。

使用说明

配置 sharding 中间件,为需要分表的业务表定义他们分表的规则。 查看 godoc 获取配置详情。

import (
    "fmt"
    "gorm.io/driver/postgres"
    "gorm.io/gorm"
    "gorm.io/sharding"
)
dsn := "postgres://localhost:5432/sharding-db?sslmode=disable"
db, err := gorm.open(postgres.new(postgres.config{dsn: dsn}))
db.use(sharding.register(sharding.config{
    shardingkey:         "user_id",
    numberofshards:      64,
    primarykeygenerator: sharding.pksnowflake,
}, "orders").register(sharding.config{
    shardingkey:         "user_id",
    numberofshards:      256,
    primarykeygenerator: sharding.pksnowflake,
    // this case for show up give notifications, audit_logs table use same sharding rule.
}, notification{}, auditlog{}))

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

// gorm 创建示例,这会插入到 orders_02 表
db.create(&order{userid: 2})
// sql: insert into orders_2 ...
// 原生 sql 插入示例,这会插入到 orders_03 表
db.exec("insert into orders(user_id) values(?)", int64(3))
// 这会抛出 errmissingshardingkey 错误,因此此处没有提供 sharding key
db.create(&order{amount: 10, productid: 100})
fmt.println(err)
// find 方法,这会检索 order_02 表
var orders []order
db.model(&order{}).where("user_id", int64(2)).find(&orders)
fmt.printf("%#v\n", orders)
// 原生 sql 也是支持的
db.raw("select * from orders where user_id = ?", int64(3)).scan(&orders)
fmt.printf("%#v\n", orders)
// 这会抛出 errmissingshardingkey 错误,因为 where 条件没有包含 sharding key
err = db.model(&order{}).where("product_id", "1").find(&orders).error
fmt.println(err)
// update 和 delete 方法与创建、查询类似
db.exec("update orders set product_id = ? where user_id = ?", 2, int64(3))
err = db.exec("delete from orders where product_id = 3").error
fmt.println(err) // errmissingshardingkey

查看笔记

扫码一下
查看教程更方便
网站地图