Sharding 是一个高性能的 Gorm 分表中间件。它基于 Conn 层做 SQL 拦截、AST 解析、分表路由、自增主键填充,带来的额外开销极小。对开发者友好、透明,使用上与普通 SQL、Gorm 查询无差别,只需要额外注意一下分表键条件。 为您提供高性能的数据库访问。
https://github.com/go-gorm/sharding
功能特点
非侵入式设计, 加载插件,指定配置,既可实现分表。
轻快, 非基于网络层的中间件,像 Go 一样快
Multiple database (PostgreSQL, MySQL) support.
Integrated primary key generator (Snowflake, PostgreSQL Sequence, Custom, …).
使用说明 配置 Sharding 中间件,为需要分表的业务表定义他们分表的规则。 See Godoc for config details.
import ( "fmt" "gorm.io/driver/postgres" "gorm.io/gorm" "gorm.io/sharding" ) db, err := gorm.Open(postgres.New(postgres.Config{DSN: "postgres://localhost:5432/sharding-db?sslmode=disable" )) db.Use(sharding.Register(sharding.Config{ ShardingKey: "user_id" , NumberOfShards: 64 , PrimaryKeyGenerator: sharding.PKSnowflake, }, "orders" , Notification{}, AuditLog{}))
依然保持原来的方式使用 db 来查询数据库。 你只需要注意在 CURD 动作的时候,明确知道 Sharding Key
对应的分表,查询条件带 Sharding Key,以确保 Sharding 能理解数据需要对应到哪一个子表。
db.Create(&Order{UserID: 2 }) db.Exec("INSERT INTO orders(user_id) VALUES(?)" , int64 (3 )) db.Create(&Order{Amount: 10 , ProductID: 100 }) fmt.Println(err) var orders []Orderdb.Model(&Order{}).Where("user_id" , int64 (2 )).Find(&orders) fmt.Printf("%#v\n" , orders) db.Raw("SELECT * FROM orders WHERE user_id = ?" , int64 (3 )).Scan(&orders) fmt.Printf("%#v\n" , orders) err = db.Model(&Order{}).Where("product_id" , "1" ).Find(&orders).Error fmt.Println(err) 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)
完整示例演示 Example 。