go 连接 mysql框架_gomodel - 轻量级Go数据库访问框架

gomodel 是一个简洁,高效的轻量级Go数据库访问框架,可以完全不使用反射而达到类似ORM的效果。

主要特点:

无反射

使用Bitset代表字段集合

代码生成

数据库错误处理

常用SQL操作函数

userfollow是一个简单的使用案例,可以通过go test测试运行。

Uservar (

ErrDuplicateUserName = httperrs.Conflict.NewS("user name already exists")

ErrNoUser = httperrs.NotFound.NewS("user not found")

)

type User struct {

Id int64

Name string

Age int

Followings int

Followers int

}

func (u *User) Add() error {

u.Followings = 0

u.Followers = 0

id, err := DB.Insert(u, userFieldsExcpId, gomodel.RES_ID)

err = dberrs.DuplicateKeyError(err, UserNameCol, ErrDuplicateUserName)

if err == nil {

u.Id = id

}

return err

}

func DeleteUserById(id int64) error {

c, err := DB.ArgsDelete(userInstance, USER_ID, id)

return dberrs.NoAffects(c, err, ErrNoUser)

}

func (u *User) Update() error {

c, err := DB.Update(u, USER_NAME|USER_AGE, USER_ID)

return dberrs.NoAffects(c, err, ErrNoUser)

}

func (u *User) ById() error {

err := DB.One(u, userFieldsExcpId, USER_ID)

return dberrs.NoRows(err, ErrNoUser)

}

func UsersByAge(age, start, count int) ([]User, error) {

users := userStore{

Fields: userFieldsAll,

}

err := DB.ArgsLimit(&users, userInstance, userFieldsAll, USER_AGE, age, start, count)

return users.Values, dberrs.NoRows(err, ErrNoUser)

}

func AllUsersByAge(age int) ([]User, error) {

users := userStore{

Fields: userFieldsAll,

}

err := DB.ArgsAll(&users, userInstance, userFieldsAll, USER_AGE, age)

return users.Values, dberrs.NoRows(err, ErrNoUser)

}

Followvar (

ErrFollowed = httperrs.Conflict.NewS("already followed")

ErrNonFollow = httperrs.NotFound.NewS("non follow")

)

type Follow struct {

UserId int64 `table:"user_follow"`

FollowUserId int64

}

//gomodel insertUserFollowSQL = [

// INSERT INTO Follow(UserId, FollowUserId)

// SELECT ?, ? FROM DUAL

// WHERE EXISTS(SELECT Id FROM User WHERE Id=?)

//]

func (f *Follow) Add() error {

return f.txDo(DB, func(tx gomodel.Tx, f *Follow) error {

c, err := tx.UpdateById(insertUserFollowSQL, gomodel.FieldVals(f, followFieldsAll, f.FollowUserId)...)

err = dberrs.NoAffects(c, err, ErrNoUser)

err = dberrs.DuplicateKeyError(err, dberrs.PRIMARY_KEY, ErrFollowed)

return f.updateFollowInfo(tx, err, 1)

})

}

func (f *Follow) Delete() error {

return f.txDo(DB, func(tx gomodel.Tx, f *Follow) error {

c, err := tx.Delete(f, followFieldsAll)

err = dberrs.NoAffects(c, err, ErrNonFollow)

return f.updateFollowInfo(tx, err, -1)

})

}

func (f *Follow) updateFollowInfo(tx gomodel.Tx, err error, c int) error {

if err == nil {

_, err = tx.ArgsIncrBy(userInstance, USER_FOLLOWINGS, USER_ID, c, f.UserId)

if err == nil {

_, err = tx.ArgsIncrBy(userInstance, USER_FOLLOWERS, USER_ID, c, f.FollowUserId)

}

}

return err

}

欢迎提Issue。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值