beego mysql按时间排序_beego的数据库操作优化

1、背景描述

用beego的ORM框架对sqllite进行库操作。项目中配置表存放在sqlite数据中,这样就存对每个表需要进行增删改查的操作。若按照beego提供方式对每一张表去实现增删改查的操作,这样会有很多的重复代码。例如,插入记录代码中,每个插入操作中都有相似的一段代码。为了代码更加的简洁,需要对重复代码进行封装。

2、实现方式

2.1、公共实现部分

利用golang的语言特性,面向接口编程,对公共操作提取接口:

type Repo interface {

SubscribeUpdateChange(func()) error

SubscribeDeleteChange(func()) error

Update(obj interface{}) (err error)

Delete(obj interface{}) (err error)

}

实现接口的结构:

type BaseRepo struct {

funcsUpdate []func()

funcsDelete []func()

}

//parameter is slice ([]StructName) or ptr(&aObj)

func (r BaseRepo) Update(obj interface{}) (err error) {

defer func() { r.UpdateChanged(err) }()

o := orm.NewOrm()

ms := TransToSlice(obj)//利用反射把入参处理成切片,需要自己实现

for _, m := range ms {

val := reflect.ValueOf(m)

if val.Kind() == reflect.Ptr {

val = val.Elem()

}

id := val.FieldByName("Id").Int()

if id == 0 {

_, err = o.Insert(m)

} else {

_, err = o.Update(m)

}

if err != nil {

return err

}

}

return nil

}

2.2、应用部分

各个配置表依据自己的需求进行接口定义[golang中组合来复用子结构的方法]:

type XxxxRepo interface {

repo.Repo

GetRecord(userName, host string) (xxxx, error)

}

type xxxxRepo struct {

repo.BaseRepo

}

func NewXxxxRepo() XxxxRepo {

return &xxxxRepo{}

}

func (this *xxxxRepo)(userName, host string) (xxxx,error){

//..........

return xxx,nil

}

3、总结

公共代码的提取,减少重复代码【clean code】

golang面向接口编程,罗列接口代码更加清晰

repo层的思考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值