反向创建表结构
什么时候需要反向创建表? 先有数据库表,需要创建结构与数据库表建立关联的时候,需要基于数据库表来反向生成表结构。 工具库(需要安装):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查询及数据读取
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的范型好像是刚出来的,看得似懂非懂,不是很会用,就照葫芦画瓢。还真被我搞懂了。 为什么会想到使用范型? 因为上面数据查询,有一个统计的需求,每查一张表实现一个函数,代码写得有点臃肿,因为大部分代码都是一样的,就是查询的表不一样和返回的结果的结构不一样,其他的都一样。想到了把整部份代码封装起来,但是返回的结果结构不能写死,需要视具体情况而定,那么就需要用一个不定类型参数来处理这样的问题,就想到了范型。
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)
补充
反引号 `` 有点折磨人
在字符串拼接的时候,最好还是把双引号去掉。
|