text/template实践(一)生成gorm文件_老鬼行帮的博客-CSDN博客_gorm text类型

源码请在评论区评论发邮件

概述

gorm1是一个非常好用的go orm库,特将常用的操作做封装:
用接口表示如下:

type GormWrapper interface {
    TableName() string    //表面
    Insert() error    //插入新行
    Update(kv map[string]interface{}) error    //更新指定指定属性或全部
    FindOne(m *{$MODELNAME}) error        //查找
    Query(kv map[string]interface{}, limit uint32, order map[string]string) (models []*{$MODELNAME}, err error) //查询
    Pagination(kv map[string]interface{}, page uint32, pageSize uint32) (*{$MODELNAME}Paginator, error)    //分页查询
}

以下都围绕上面功能展开

前期准备

go get -u github.com/jinzhu/gorm
go get -u github.com/spf13/viper
go get -u github.com/go-sql-driver/mysql

viper是以用于获取配置文件配置项的库

目录结构

demo
    |_bin            #build的可执行文件存放目录
    |_config            #配置
        |_main.json    #配置文件
        |_reg.go        #配置解析
    |_gmodels
        |_gen        # 解析器源码和组件脚本
        |___|_build.sh  #gen.go组件脚本
        |___|_gen.go   #gorm解析db脚本
        |_db.go        # db工厂,通过db访问的统一入口,便于model封装
        |_export.sh    # orm导出脚本

使用方法

第一步,执行build.sh

第二步,添加需要生成orm的表名

#!/usr/bin/env bash
cd ${GOPATH}/src/demo/bin
./gorm_gen -tablename="tablename1,tablename2" -outpath="./../gmodels/"

上面tablename1,tablename2替换成实际值,每张表用逗号分隔

第三步,执行export.sh

输出gmodel样例:

package gmodels
import (
    "github.com/pkg/errors"
)

type ReportLog struct { 
    GameRecordId  int `gorm:"column:game_record_id;type:int(10) unsigned;primary_key;AUTO_INCREMENT"` //唯一对局记录ID
    GameRoomId  int `gorm:"column:game_room_id;type:int(10) unsigned;default:0"` //房间号
    GameMode  int8 `gorm:"column:game_mode;type:tinyint(3) unsigned;default:0"` //
    GameModeDesc  string `gorm:"column:game_mode_desc;type:varchar(255);size:255"` //房间类型描述
    Title  string `gorm:"column:title;type:varchar(32);size:32"` //对局房间显示的名称
    Players  string `gorm:"column:players;type:text"` //玩家数据
    StartTime  int `gorm:"column:start_time;type:int(10) unsigned;default:0"` //对局开始时间
    EndTime  int `gorm:"column:end_time;type:int(10) unsigned;default:0"` //对局结束时间
    CallbackCostMs  int `gorm:"column:callback_cost_ms;type:int(10) unsigned;default:0"` //回调花费的毫秒数
}

type ReportLogPaginator struct {
    Data         []*ReportLog
    CurPage        uint32
    TotalPage     uint32
    PageSize     uint32
    TotalSize    uint32
}

func(self ReportLog) TableName() string{
    return "report_log"
}

func(self *ReportLog) Insert() error {

    return GetDB().Create(self).Error
}

func(self *ReportLog) Update(kv map[string]interface{}) error{
    if len(kv) > 0 {//仅更新指定字段
        return GetDB().Model(self).Updates(kv).Error
    }else{//更新所有字段
        return GetDB().Save(self).Error
    }
}

func(self *ReportLog) FindOne(m *ReportLog) error{
    return GetDB().Where(&m).First(&self).Error
}

func(self *ReportLog) Query(kv map[string]interface{}, limit uint32, order map[string]string) (models []*ReportLog, err error){
    err = GetDB().Table(self.TableName()).Limit(limit).Where(kv).Find(&models).Error
    return
}

func(self *ReportLog) Pagination(kv map[string]interface{}, page uint32, pageSize uint32) (*ReportLogPaginator, error) {
    offset := (page - 1) * pageSize
    limit := pageSize

    paginator := &ReportLogPaginator{Data:[]*ReportLog{}, CurPage:page, PageSize:pageSize}

    //查询数据总览
    var err error
    err = GetDB().Table(self.TableName()).Where(kv).Count(&paginator.TotalSize).Error
    if err != nil {
        return nil, errors.Wrap(err, "Query Error Pagination ReportLog")
    }

    if paginator.TotalSize <= 0 {
        paginator.TotalPage = 1
        return paginator, nil
    }

    paginator.TotalPage = paginator.TotalSize / paginator.PageSize

    err = GetDB().Limit(limit).Offset(offset).Where(kv).Find(&paginator.Data).Error
    if err != nil {
        return nil, errors.Wrap(err, "Query Error Pagination ReportLog")
    }

    return paginator, err
}

    • *
  1. http://gorm.io/docs/ ↩︎

原网址: 访问
创建于: 2022-08-17 00:48:59
目录: default
标签: 无

请先后发表评论
  • 最新评论
  • 总共0条评论