代码拉取完成,页面将自动刷新
shorm is a orm tool wriitted in golang, which supports database sharding and master-slave mode
go get github.com/shengzhi/shorm
cluster := &Cluster{TotalGroups: 5}
cluster.Groups = append(cluster.Groups,
&DbGroup{
IsDefault: true,
RangeFrom: 0,
RangeTo: 3,
Name: "Group1",
Nodes: []*DbNode{
{
Name: "G1_Master",
ConnStr: connstr,
Type: NodeType_Master,
},
{
Name: "G1_Node1",
ConnStr: connstr,
Type: NodeType_Slave,
},
},
},
)
cluster.Groups = append(cluster.Groups,
&DbGroup{
RangeFrom: 3,
RangeTo: 5,
Name: "Group2",
Nodes: []*DbNode{
{
Name: "G2_Master",
ConnStr: connstr2,
Type: NodeType_Master,
},
{
Name: "G2_Node1",
ConnStr: connstr2,
Type: NodeType_Slave,
},
},
})
engine := shorm.NewEngine("mssql", &cluster)
if no sharding value, sql query will be executed against all groups
if the sharding value falls in[0,3), the sql query will be exeucted against Group1
if the sharding value falls in[3,5), the sql query will be exeucted against Group2
Create engine from config file
engine, err := shorm.NewEngineFromConfig("cluster_config.json")
Create table T_User(
UserId bigint not null,
UserName varchar(50) not null default '',
Age int not null default 0,
CreatedTime datetime not null default getdate(),
)
Alter table T_User create cluster index PK_User(UserId asc)
type User struct{
TabName shorm.TableName `shorm:"T_User"`
Id int64 `shorm:"UserId,pk,shard"`
UserName string
Age int32
CreatedTime time.Time
}
func (u User) GetShardValue() int64{
return u.Id
}
s := engine.StartSession()
defer engine.EndSession(s)
u := User{}
s.ShardValue(1).Id(1).Get(&u)
it will generate sql as below:
select top 1 * from T_User where UserId=1
and will locate the database "G1_node1"
shorm provides three ways to locate the database
Query operations
s.Omit("CreatedTime").Get(&u)
s.Cols("UserId,UserName").Get(&u)
var slice []*User
s.Where("Age > ?", 18).Find(&slice)
type AscendingUser []*User
func(list AscendingUser) Len() int{
return len(list)
}
func(list AscendingUser) Less(i, j int) bool{
return list[i].Id < list[j].Id
}
func (list AscendingUser) Swap(i, j int){
list[i],list[j] = list[j],list[i]
}
minimumId := 0
pageSize := 10
pageIndex := 0
var slice AscendingUser
s.Where("UserId>?",minimumId).And("Age>?",18).Limit(pageIndex * pageSize, pageSize).Find(&slice)
sort.Sort(slice)
return slice[:pageSize]
================================================================
type DescendingUser []*User
func(list DescendingUser) Len() int{
return len(list)
}
func(list DescendingUser) Less(i, j int) bool{
return list[i].Id > list[j].Id
}
func (list DescendingUser) Swap(i, j int){
list[i],list[j] = list[j],list[i]
}
maximumId := math.MaxInt64
pageSize := 10
pageIndex := 0
var slice AscendingUser
s.Where("UserId<?",maximumId).And("Age>?",18).OrderBy("UserId desc").Limit(pageIndex * pageSize, pageSize).Find(&slice)
sort.Sort(slice)
return slice[:pageSize]
s.ShardValue(100).In("UserId",12,234,345).Find(&slice)
s.ShardValue(100).Between("UserId",10,100).Find(&slice)
Insert data
user := User{
Id: 1001,
UserName: "Test",
Age: 18,
CreatedTime: time.Now(),
}
count,err := s.Insert(&user)
users := make(*User, 0)
result, err := s.InsertSlice(&users)
fmt.Println(result.Success)
fmt.Println(result.FailedData)
trans, err := engine.BeginTrans(shardValue)
if _, err = trans.Insert(&user1);err != nil{
trans.Rollback()
return
}
if _, err = trans.InsertSlice(&orderList);err != nil{
trans.Rollback()
return
}
trans.Commit()
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
1. 开源生态
2. 协作、人、软件
3. 评估模型