Inverser la création de la structure de la table
Quand avez-vous besoin de créer des tables à l'envers ?
Il y a d'abord les tables de la base de données, lorsqu'il est nécessaire de créer une structure et d'établir une association avec la table de la base de données, il est nécessaire de générer à l'envers la structure de la table à partir de la table de la base de données.
Bibliothèque d'outils (nécessite une installation) : 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 用户名.
commande de génération
// 更加详细可以参考上面的命令
go/bin/gormt -H=ip -d=database -p=pwd -u=username --port=3306 -F=false -b table_name1,table_name2...
Requête SQL native et lecture de données
// 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
utilisation de paradigmes
Peu de temps après mon premier contact avec le go, j'ai pensé que je ne pourrais peut-être pas l'utiliser, alors j'ai vérifié l'information.Le paradigme du go semble tout juste sortir. J'ai vraiment compris.
Pourquoi pensez-vous utiliser des paradigmes ?
En raison de la requête de données ci-dessus, il existe une exigence statistique. Chaque fois qu'une table est vérifiée pour implémenter une fonction, le code est un peu gonflé, car la plupart du code est le même, c'est-à-dire que la table de requête est différente et que le La structure du résultat renvoyé est différente. Tout le reste est identique. J'ai pensé à encapsuler toute la partie du code, mais la structure du résultat renvoyé ne peut pas être codée en dur, elle doit être déterminée en fonction de la situation spécifique, alors je dois utiliser un paramètre de type indéterminé pour traiter un tel problème , et j'ai pensé au paradigme.
// 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)
Remplir
反引号 `` 有点折磨人
在字符串拼接的时候,最好还是把双引号去掉。