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

本文介绍了如何使用gormt工具反向生成Go语言中的数据库表结构,便于快速创建与数据库关联的模型。同时,文章探讨了Go语言泛型的使用场景,通过一个统计查询的例子展示了如何利用泛型减少重复代码,提高代码复用性。
摘要由CSDN通过智能技术生成
反向创建表结构

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

补充

反引号 `` 有点折磨人
在字符串拼接的时候,最好还是把双引号去掉。
范型(Generics)是一种在编程中用于创建可重用、类型安全的代码的机制。它允许在编写代码时使用参数化类型,以便在不同上下文中可以使用不同的类型。 范型的原理是通过在代码中使用类型参数来实现。在定义类、接口或方法时,可以使用类型参数来代替具体的类型。这样,当使用该类、接口或方法时,可以传入不同的类型参数,使其在不同的上下文中适应不同的数据类型。 范型使用场景有以下几个方面: 1. 类型安全:通过使用范型,可以在编译时检测类型错误,避免在运行时出现类型不匹配的错误。这提供了更好的代码可靠性和可维护性。 2. 代码复用:范型可以使代码更加通用和灵活。可以编写只需编写一次的通用算法或数据结构,并且可以在不同的数据类型上重复使用。 3. 集合框架:Java集合框架中广泛使用范型。通过使用范型,可以创建类型安全的集合类,例如List、Set和Map等。这样,在编译时就能检测到插入错误类型的元素。 4. 自定义数据结构使用范型可以创建自定义的泛型类和泛型接口,以适应不同类型的数据。例如,可以创建泛型的栈(Stack)或队列(Queue)等数据结构。 总的来说,范型使用场景涵盖了许多方面,包括提高代码的类型安全性、实现代码的可复用性和编写通用的数据结构等。通过使用范型,可以更好地设计和编写灵活、可扩展的代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值