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层的思考
  • 相关阅读:
    BlogEngine.Net
    加速Web开发的9款知名HTML5框架
    个人论坛博客的代码
    Android客户端调用Asp.net的WebService
    前端总结数据结构与算法基础
    node知识点及第三方模块
    消息轮播
    el-date-picker 组件时间格式化方式
    Vue+Element前端导入导出Excel
    vue单元测试
  • 原文地址:https://www.cnblogs.com/meiguhuaxian/p/12781633.html
Copyright © 2011-2022 走看看