在执行一行代码的时候注意到报错:
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扫描到数据中就会报错。
如何解决:
- 使用指针
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即可取到值
- 可以用
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
}
- 使用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有时候并没有那么好用!