参考资料
[1] 连贯到数据库
[2] 官网文档

1. 简介

gorm是应用的orm映射,所以须要定义要操作的表的model,在go中须要定义一个structstruct的名字就是对应数据库中的表名,留神gorm查找struct名对应数据库中的表名的时候会默认把你的struct中的大写字母转换为小写并加上“s”,所以能够加上 db.SingularTable(true)gorm本义struct名字的时候不必加上“s”。

golang中,首字母大小写来示意public或者private,因而构造体中字段首字母必须大写。

定义model,即struct时,咱们能够只定义咱们须要从数据库中取回的特定字段:
gorm在本义表名的时候会把struct的大写字母(首字母除外) 替换成“_”,所以上面的”GoSystemInfo”会本义成数据库中对应的“go_system_info”的表名, 对应的字段名的查找会先依照tag外面的名称去外面查找,如果没有定义标签则依照struct定义的字段查找,查找的时候struct字段中的大写会被本义成“_”,如:“SystemId”会去查找表中的system_id字段。

1. join查问

https://blog.csdn.net/f95_slj...

type JobCKDao struct{} func (dao *JobCKDao) MonitorQuery(ctx context.Context, gSession *gorm.DB) []*JobData {   var db *gorm.DB   var jobDatas []*JobData   db = gSession.Table("job").Order("job.ysid DESC") //.Where("job.state in (?)", []int{0, 1, 3}) // 只查问状态为0, 1, 3的job   db.Select("job.ysid as job_id,job.project_id as project_id,user.name as user_name,job.name as job_name,job.state as status,project.maxproc as maxproc,job.created_at as create_time,job.end_time as end_time").      Joins("join user on user.ysid = job.user_id").Joins("join project on job.project_id = project.ysid").Limit(5).Scan(&jobDatas)   return jobDatas}

2. 关联查问

https://www.jianshu.com/p/b2d...

3.连贯clickhouse遇到的坑

如果在go 中执行:

// 每时刻所有节点cpu的平均值type AllNodeCpuAveData struct {   User   float64 `json:"user" binding:"required"`   Free   float64 `json:"free" binding:"required"`   System float64 `json:"system" binding:"required"`   Time   int64   `json:"time" binding:"required"`}type Cpu struct {   Ysid        int64     `gorm:"primary_key;AUTO_INCREMENT;column:ysid;type:bigint;"`   NodeName    string    `gorm:"column:node_name;type:varchar;size:128;"`   NodeIp      string    `gorm:"column:node_ip;type:varchar;size:128;"`   User        float64   `gorm:"column:user;type:decimal;"`     //从系统启动开始累计到以后时刻,用户态的CPU工夫(单位:jiffies) ,不蕴含 nice值为负过程。1jiffies=0.01秒   Nice        float64   `gorm:"column:nice;type:decimal;"`     //从系统启动开始累计到以后时刻,nice值为负的过程所占用的CPU工夫(单位:jiffies)   System      float64   `gorm:"column:system;type:decimal;"`   //从系统启动开始累计到以后时刻,内核态工夫(单位:jiffies)   Idle        float64   `gorm:"column:idle;type:decimal;"`     //从系统启动开始累计到以后时刻,闲暇工夫(单位:jiffies)   IoWait      float64   `gorm:"column:io_wait;type:decimal;"`  //从系统启动开始累计到以后时刻,闲暇工夫(单位:jiffies)   Irq         float64   `gorm:"column:irq;type:decimal;" `     //从系统启动开始累计到以后时刻,硬中断工夫(单位:jiffies)   SoftIrq     float64   `gorm:"column:soft_irq;type:decimal;"` //从系统启动开始累计到以后时刻,软中断工夫(单位:jiffies)   Steal       float64   `gorm:"column:steal;type:decimal;"`   Guest       float64   `gorm:"column:guest;type:decimal;"`   GuestNice   float64   `gorm:"column:guest_nice;type:decimal;"`   TotalLast   float64   `gorm:"column:total_last;type:decimal;"`  //上次总工夫 User + Nice + System + Idle + Iowait + IRQ + SoftIRQ + Steal + Guest   UsageRate   float64   `gorm:"column:usage_rate;type:decimal;"`  //以后总应用百分比   IowaitRate  float64   `gorm:"column:iowait_rate;type:decimal;"` // IO期待应用百分比   UserRate    float64   `gorm:"column:user_rate;type:decimal;"`   //用户态百分比   SystemRate  float64   `gorm:"column:system_rate;type:decimal;"` //内核态百分比   IdleRate    float64   `gorm:"column:idle_rate;type:decimal;"`   //闲暇态百分比   NanoTime    int64     `gorm:"column:nano_time;type:bigint;"`    // 工夫戳,单位:秒   CollectTime time.Time `gorm:"column:collect_time;type:timestamp;default:CURRENT_TIMESTAMP;"`   CreatedAt   time.Time `gorm:"column:created_at;type:timestamp;default:CURRENT_TIMESTAMP;"`   UpdatedAt   time.Time `gorm:"column:updated_at;type:timestamp;default:CURRENT_TIMESTAMP;"`}db, err := gorm.Open(clickhouse.Open(dsn), &gorm.Config{})if err!=nil{   fmt.Print("报错了,err=",err)   return}fmt.Println("连贯胜利!")//var db1  *gorm.DBvar result []AllNodeCpuAveDatadb.Table("cpu").Select("nano_time,avg(user) as user,avg(system)-avg(user) as free,avg(system) as system").Group("nano_time").Scan(&result) // 找出合乎时间段内并以工夫分组fmt.Println("result=",result)

报错:

2021/02/04 20:00:29 ?[31;1mD:/wzz/study/clickHouseDemo/fl/fl.go:66 ?[35;1mcode: 184, message: Aggregate function avg(nano_time) is found inside another aggregate function in query: While processing avg(nano_time) AS user; code: 184, message: Aggregate function avg(nano_time) is found inside another aggregate function in query: While processing avg(nano_time) AS user?[0m?[33m[1.995ms] ?[34;1m[rows:-]?[0m SELECT max(ysid) as system,avg(user) as free,avg(nano_time) as user FROM `cpu`result= []

起因在于AllNodeCpuAveData的字段名称与cpu中的字段名称雷同。
解决办法

// 将字段名称改为不同type AllNodeCpuAveData struct {   Userd   float64 `json:"userd" binding:"required"`   Freed   float64 `json:"freed" binding:"required"`   Systemd float64 `json:"systemd" binding:"required"`   Time   int64   `json:"time" binding:"required"`}db.Table("cpu").Select("nano_time,avg(user) as userd,avg(system)-avg(user) as freed,avg(system) as systemd").Group("nano_time").Scan(&result) // 找出合乎时间段内并以工夫分组