Go-Sharding is a simple Sharding middleware, auto-generate Model & Sharding CRUD methods based on model yml
- Auto mapping SQL to Sharding databases & tables
- Distributed UUID generator based on Snowflake
- Scaling databases & tables
- Auto create table scripts
- Model & CRUD methods generator
- Connection Pool
- Write/Read Splitting
- SQL log & Slow SQL log for profiling
sudo rm -fr /usr/local/go
Download & Install MacOS pkg from https://golang.org/dl/
export PATH=$PATH:/usr/local/go/binwget https://golang.org/dl/go1.15.1.linux-amd64.tar.gz
sudo tar -C /usr/local/ -xzvf go1.15.1.linux-amd64.tar.gz
sudo vi /etc/profile
export GOROOT=/usr/local/go
export GOPATH=/data/go
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOROOT/bin
export PATH=$PATH:$GOPATH/binDefine Datasources in datasource.yml
datasources:
- name: ds_0write: root:root@tcp(127.0.0.1:3306)/my_db_0?charset=utf8mb4&parseTime=Trueread: root:root@tcp(127.0.0.1:3306)/my_db_0?charset=utf8mb4&parseTime=True
- name: ds_1write: root:root@tcp(127.0.0.1:3306)/my_db_1?charset=utf8mb4&parseTime=Trueread: root:root@tcp(127.0.0.1:3306)/my_db_1?charset=utf8mb4&parseTime=True
- name: ds_2write: root:root@tcp(127.0.0.1:3306)/my_db_2?charset=utf8mb4&parseTime=Trueread: root:root@tcp(127.0.0.1:3306)/my_db_2?charset=utf8mb4&parseTime=True
- name: ds_3write: root:root@tcp(127.0.0.1:3306)/my_db_3?charset=utf8mb4&parseTime=Trueread: root:root@tcp(127.0.0.1:3306)/my_db_3?charset=utf8mb4&parseTime=True
- name: ds_4write: root:root@tcp(127.0.0.1:3306)/my_db_4?charset=utf8mb4&parseTime=Trueread: root:root@tcp(127.0.0.1:3306)/my_db_4?charset=utf8mb4&parseTime=True
- name: ds_5write: root:root@tcp(127.0.0.1:3306)/my_db_5?charset=utf8mb4&parseTime=Trueread: root:root@tcp(127.0.0.1:3306)/my_db_5?charset=utf8mb4&parseTime=Truesql_log: falseslow_sql_log: 500 (ms)sharding_table_number: 255sharding_column: uidsharding_node_id: 1 (0~1023)Define Models in model.yml
models:
- model: Useruid: int64|autoname: stringcreated_at: time.Time
- model: Eventuid: int64event: stringcreated_at: time.TimeGenerate Model go files
go run gen.goYou can use your Model for Sharding databases & tables now:
package main
import (
"fmt""time"
. "github.com/hide2/go-sharding/db"
. "github.com/hide2/go-sharding/model"
)
funcmain() {
// Gen UUIDfori:=0; i<10; i++ {
uid:=GenUUID()
fmt.Println("[GenUUID]", uid)
}
// Drop Sharding tablesfort:=0; t<GoShardingTableNumber; t++ {
sql:=fmt.Sprintf("DROP TABLE IF EXISTS user_%d", t)
fmt.Println("[Exec]", sql)
User.Exec(sql)
}
fort:=0; t<GoShardingTableNumber; t++ {
sql:=fmt.Sprintf("DROP TABLE IF EXISTS event_%d", t)
fmt.Println("[Exec]", sql)
User.Exec(sql)
}
// Create Sharding tablesfmt.Println("[CreateTable]")
User.CreateTable()
Event.CreateTable()
// Cvaruid, uid2, uid3int64fori:=0; i<10; i++ {
u:=User.New()
u.Name="John"u.CreatedAt=time.Now()
u.Save()
fmt.Println("[Save User]", u.ID, u.Uid, u.Name, u.Datasource, u.Table)
ifi==0 {
uid=u.Uid
}
ifi==1 {
uid2=u.Uid
}
ifi==2 {
uid3=u.Uid
}
}
fmt.Println(uid, uid2, uid3)
fori:=0; i<10; i++ {
e:=Event.New()
e.Uid=uid3e.Event="buy"e.CreatedAt=time.Now()
e.Save()
fmt.Println("[Save Event]", e.ID, e.Uid, e.Event, e.Datasource, e.Table)
}
// Ru, e:=User.FindByUid(123)
fmt.Println("[FindByUid(123)]", u, e)
u, _=User.FindByUid(uid)
fmt.Println("[FindByUid]", u.ID, u.Uid, u.Name, u.Datasource, u.Table)
u, _=User.FindByUidAndID(uid, 1)
fmt.Println("[FindByUidAndID]", u.ID, u.Uid, u.Name, u.Datasource, u.Table)
// Uu.Name="Calvin"u.Save()
fmt.Println("[Update]", u.ID, u.Uid, u.Name, u.Datasource, u.Table)
u, _=User.FindByUid(uid)
fmt.Println("[FindByUid]", u.ID, u.Uid, u.Name, u.Datasource, u.Table)
// Du, _=User.FindByUid(uid)
fmt.Println("[Before Delete FindByUid]", u)
u.Delete()
u, _=User.FindByUid(uid)
fmt.Println("[After Delete FindByUid]", u)
u, _=User.FindByUid(uid2)
fmt.Println("[Before Destroy FindByUid]", u)
User.DestroyByUid(uid2)
u, _=User.FindByUid(uid2)
fmt.Println("[After Destroy FindByUid]", u)
// Createfori:=0; i<10; i++ {
props:=map[string]interface{}{"name": "Dog", "created_at": time.Now()}
u, _=User.Create(props)
fmt.Println("[Create User]", u.ID, u.Uid, u.Name, u.Datasource, u.Table)
}
fori:=0; i<10; i++ {
props:=map[string]interface{}{"uid": uid3, "event": "gold", "created_at": time.Now()}
e, _:=Event.Create(props)
fmt.Println("[Create Event]", e.ID, e.Uid, e.Event, e.Datasource, e.Table)
}
// WHEREconds:=map[string]interface{}{"uid": uid3}
es, _:=Event.Where(conds)
for_, v:=rangees {
fmt.Println("[Where Sid]", v.ID, v.Uid, v.Event, v.Datasource, v.Table)
}
// WHERE OrderBy&Limit&Offsetconds=map[string]interface{}{"uid": uid3}
es, _=Event.OrderBy("ID DESC").Offset(2).Limit(3).Where(conds)
for_, v:=rangees {
fmt.Println("[Where Sid Limit Offset OrderBy]", v.ID, v.Uid, v.Event, v.Datasource, v.Table)
}
// WHERE Paginateconds=map[string]interface{}{"uid": uid3}
es, _=Event.Page(1, 5).Where(conds)
for_, v:=rangees {
fmt.Println("[Where Paginate]", v.ID, v.Uid, v.Event, v.Datasource, v.Table)
}
// WHERE with no Sharding Column, Find Across All Databases & Tablesconds=map[string]interface{}{"event": "gold"}
es, _=Event.Where(conds)
for_, v:=rangees {
fmt.Println("[Where No Sid]", v.ID, v.Uid, v.Event, v.Datasource, v.Table)
}
// COUNTconds2:=map[string]interface{}{"uid": uid3}
conds3:=map[string]interface{}{"uid": uid3, "event": "gold"}
conds4:=map[string]interface{}{"event": "gold"}
c, _:=Event.CountAll()
fmt.Println("[CountAll]", c)
c, _=Event.Count(conds2)
fmt.Println("[Count With Sid]", c)
c, _=Event.Count(conds3)
fmt.Println("[Count With Sid And Conds]", c)
c, _=Event.Count(conds4)
fmt.Println("[Count Without Sid]", c)
// UPDATEprops3:=map[string]interface{}{"event": "item"}
conds5:=map[string]interface{}{"uid": uid3, "event": "item"}
Event.Update(props3, conds3)
es2, _:=Event.Where(conds5)
fmt.Println("[Update]", len(es2))
for_, v:=rangees2 {
fmt.Println("[Update]", v.ID, v.Uid, v.Event, v.Datasource, v.Table)
}
}