zoukankan      html  css  js  c++  java
  • 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、总结

    1. 公共代码的提取,减少重复代码【clean code】
    2. golang面向接口编程,罗列接口代码更加清晰
    3. repo层的思考
  • 相关阅读:
    页面加载完后要执行的代码
    作为90后迈向成为一个优秀的男人系列之一
    今天看的一本书关于复制威力总结
    Ext.Net弹出窗口回写父窗口
    div 显示滚动条与div显示隐藏的CSS代码
    你可以向马云学习什么
    灵活多变的工作台页面配置Spring.Net.Framwork春天快速开发平台
    ROW_NUMBER() OVER函数的基本用法
    EXTJS4官方文档翻译系列一:类系统和编码规范
    SQLserver2008全文检索使用方法
  • 原文地址:https://www.cnblogs.com/meiguhuaxian/p/12781633.html
Copyright © 2011-2022 走看看