gorm max(*) 解决 converting NULL to ...

1,143 阅读1分钟

在执行一行代码的时候注意到报错:

func (t *TaskDao) FindTaskMaxIdNum(ctx context.Context, projectCode int64) (v int64, err error) {
	session := t.conn.Session(ctx)
	err = session.Model(&data.Task{}).Where("project_code=?", projectCode).Select("max(id_num) as maxIdNum").Scan(&v).Error
	return
}
sql: Scan error on column index 0, name "max(id_num)": converting NULL to int64 is unsupported

因为数据库中没有数据,所以查出来是NULL,将NULL扫描到数据中就会报错。

如何解决:

  1. 使用指针
func (t *Task) FindTaskMaxIdNum(ctx context.Context, projectCode int64) (v int64, err error) {
  session := t.conn.Session(ctx)
  err = session.Model(&task.Task{}).Where("project_code=?", projectCode).Select("max(id_num)").Scan(&v).Error
  return
}

外部只需要*data即可取到值

  1. 可以用var data []int64来取值,最后做一个变量累加返回即可
func (t *Task) FindTaskMaxIdNum(ctx context.Context, projectCode int64) (sum *nt64, err error) {
    var res []int64
    session := t.conn.Session
    err := session.Model(&task.Task{}).Pluck("max(id_num)",&res)
    for _, v := range res {
        sum += v
    }
    return
}
  1. 使用sql中的IFNULL或者COALESCE
func (t *Task) FindTaskMaxIdNum(ctx context.Context, projectCode int64) (v int64, err error) {
  session := t.conn.Session(ctx)
  err = session.Model(&task.Task{}).Where("project_code=?",projectCode).Select("coalesce(max(id_num), 0)").Scan(&v).Error
  return
}
func (t *Task) FindTaskMaxIdNum(ctx context.Context, projectCode int64) (v int64, err error) {
  session := t.conn.Session(ctx)
  err = session.Model(&task.Task{}).Where("project_code=?",projectCode).Select("ifnull(max(id_num), 0)").Scan(&v).Error
  return
}

吐槽:gorm有时候并没有那么好用!