go 反向创建表结构+原生sql查询及数据读取+范型的使用

反向创建表结构

什么时候需要反向创建表?
先有数据库表,需要创建结构与数据库表建立关联的时候,需要基于数据库表来反向生成表结构。
工具库(需要安装):gormt

安装命令
go get -u https://github.com/xxjwxc/gormt

在这里插入图片描述

./gormt --help
or
./gormt -h

-------------------------------------------------------
base on gorm tools for mysql database to golang struct

Usage:
  main [flags]

Flags:
  -d, --database string   数据库名
  -f, --foreign           是否导出外键关联
  -F, --fun               是否导出函数
  -g, --gui               是否ui显示模式
  -h, --help              help for main
  -H, --host string       数据库地址.(注意-H为大写)
  -o, --outdir string     输出目录
  -p, --password string   密码.
      --port int          端口号 (default 3306)
  -s, --singular          是否禁用表名复数
  -b, --table_names string 表名称  
  -l, --url string        url标签(json,url)
  -u, --user string       用户名.

生成命令

// 更加详细可以参考上面的命令
go/bin/gormt -H=ip -d=database -p=pwd -u=username --port=3306 -F=false -b table_name1,table_name2...

原生sql查询及数据读取

// err := DB.Raw(sql, args...).Scan(&res).Error
sql := `SELECT c.name as name,SUM(d.num) as total from (SELECT id,num,time from d WHERE time BETWEEN ? AND ?) d INNER JOIN (SELECT id,name,k from c) c on d.id=c.id GROUP BY DAY(d.time),d.id ORDER BY d.time;`
err := DB.Raw(sql, todayStart, todayStop).Scan(&res).Error

范型的使用

刚接触go不久,想到不一定会用,然后去查资料,go的范型好像是刚出来的,看得似懂非懂,不是很会用,就照葫芦画瓢。还真被我搞懂了。
为什么会想到使用范型?
因为上面数据查询,有一个统计的需求,每查一张表实现一个函数,代码写得有点臃肿,因为大部分代码都是一样的,就是查询的表不一样和返回的结果的结构不一样,其他的都一样。想到了把整部份代码封装起来,但是返回的结果结构不能写死,需要视具体情况而定,那么就需要用一个不定类型参数来处理这样的问题,就想到了范型。

// res 就是 所说的范型
func Statistics[T any](context *gin.Context, DB *gorm.DB, sql string, claim string, res []T) {
    
    
	today := time.Now().Add(-time.Hour * 24)
	todayStart := today.Format("2006-01-02") + " 00:00:00"
	todayStop := today.Format("2006-01-02") + " 23:59:59"
	err := DB.Raw(sql, todayStart, todayStop).Scan(&res).Error
	if err != nil {
    
    
		// 加一个 日志对象, 把错误信息打印到日志里。
		fmt.Println(err)
		return
	}
	b, _ := json.Marshal(res)
	bStr := string(b)
	// 把双引号去掉
	bStr = strings.ReplaceAll(bStr, "\"", "")
	msg := todayStart + " ~ " + todayStop + claim + bStr
	uitls.SendMsg(msg)
	data := gin.H{
    
    
		"resList":    res,
		"len":        len(res),
		"todayStart": todayStart,
		"todayStop":  todayStop,
	}
	response.Response(context, 200, data, "查询结果!")
}

// 调用
var res []model.MyStruct
Statistics[model.MyStruct](context, DB, sql, claim, res)

补充

反引号 `` 有点折磨人
在字符串拼接的时候,最好还是把双引号去掉。

猜你喜欢

转载自blog.csdn.net/wjl__ai__/article/details/124760408
今日推荐