源码请在评论区评论发邮件
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
}
原网址: 访问
创建于: 2022-08-17 00:48:59
目录: default
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论