ir a la creación inversa de la estructura de la tabla + consulta nativa de sql y lectura de datos + uso del paradigma

Crear estructura de tabla inversa

¿Cuándo necesitas crear tablas a la inversa?
Primero están las tablas de la base de datos, cuando es necesario crear una estructura y establecer una asociación con la tabla de la base de datos, es necesario generar inversamente la estructura de la tabla en función de la tabla de la base de datos.
Biblioteca de herramientas (requiere instalación): gormt

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

inserte la descripción de la imagen aquí

./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       用户名.

comando de compilación

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

Consulta sql nativa y lectura de datos.

// 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

uso de paradigmas

No mucho después de que entré en contacto con go, pensé que tal vez no podría usarlo, así que revisé la información.El paradigma de go parece haber salido. Realmente lo entendí.
¿Por qué piensas en usar paradigmas?
Debido a la consulta de datos anterior, existe un requisito estadístico. Cada vez que se verifica una tabla para implementar una función, el código está un poco inflado, porque la mayor parte del código es el mismo, es decir, la tabla de consulta es diferente y el la estructura del resultado devuelto es diferente. Todo lo demás es igual. Pensé en encapsular toda la parte del código, pero la estructura del resultado devuelto no puede codificarse de forma rígida, debe determinarse de acuerdo con la situación específica, luego necesito usar un parámetro de tipo indeterminado para tratar ese problema. , y pensé en el paradigma.

// 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)

Reponer

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

Supongo que te gusta

Origin blog.csdn.net/wjl__ai__/article/details/124760408
Recomendado
Clasificación