34 Commits
1 Branches
0 Tags
0 Releases
克隆/下载
master
管理
master
文件
新建文件
上传文件
搜索文件
挂件
shorm
HTTPS SSH
复制
下载ZIPshengzhi 最后提交于 2017-02-07 16:48 .-- bug fix
LICENSE
GitHub Update LICENSE
2016-06-15 16:41
README.md
GitHub Update README.md
2016-07-05 09:51
cluster.go
GitHub Update cluster.go
2016-06-15 15:07
engine.go
shengzhi --add db Marshaller and Unmarshaller interface
2017-01-27 00:13
engine_test.go
GitHub Update engine_test.go
2016-06-15 11:40
metadata.go
shengzhi --add db Marshaller and Unmarshaller interface
2017-01-27 00:13
scan.go
shengzhi --add db Marshaller and Unmarshaller interface
2017-01-27 00:13
session.go
shengzhi -- fix bug for can't fill data into extend field with struct type
2016-10-08 14:52
session_exec.go
shengzhi -- bug fixed
2016-09-14 08:46
session_query.go
shengzhi --add db Marshaller and Unmarshaller interface
2017-01-27 00:13
sqlgen.go
shengzhi -- bug fix
2017-02-07 16:48
sqlgen_mssql.go
shengzhi --
2016-08-28 15:17
tran.go
shengzhi -- fix bug for can't fill data into extend field with struct type
2016-10-08 14:52
Loading...
README.md 5.28 KB
shormshorm is a orm tool wriitted in golang, which supports database sharding and master-slave mode
Installationgo get github.com/shengzhi/shorm
Features Struct -> table mapping support Fluent API Transaction support Both ORM and raw sql support Database cluster support Master-slave mode support Struct field support, will be stored as json string Drivers support MsSql: github.com/denisenkom/go-mssqldb mysql: github.com/go-sql-driver/mysql MyMysql: github.com/ziutek/mymysql/godrv Postgres: github.com/lib/pq SQLite: github.com/mattn/go-sqlite3 Change log Quick start Create engine from code 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 Group2Create engine from config file
engine, err := shorm.NewEngineFromConfig("cluster_config.json")Define go struct to mapping data table
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 }Get value via specify sharding value
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=1and will locate the database "G1_node1"
shorm provides three ways to locate the database
Specify sharding value by call session.ShardValue(value int64), with highest priority Go struct implements Shardinger interface, with higher priority Mark field with "shard" in shorm struct tag, with lowest priorityQuery operations
Omit columns Go s.Omit("CreatedTime").Get(&u) Include specified columns, ignore others Go s.Cols("UserId,UserName").Get(&u) Query multiple records against all groups Go var slice []*User s.Where("Age > ?", 18).Find(&slice)Paging, if sharding value not be specified, shorm will query data from all groups, so struct collection must implement the sort interface to achieve pagination
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]In operatiion
s.ShardValue(100).In("UserId",12,234,345).Find(&slice)Between operation
s.ShardValue(100).Between("UserId",10,100).Find(&slice)Insert data
Insert one record Go user := User{ Id: 1001, UserName: "Test", Age: 18, CreatedTime: time.Now(), } count,err := s.Insert(&user) Insert slice Go users := make(*User, 0) result, err := s.InsertSlice(&users) fmt.Println(result.Success) fmt.Println(result.FailedData) Database transaction(only support single database transaction) Go 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()捐赠
项目点评 ( 0 )你可以在登录后,对此项目发表评论