首页 > 数据库 >gorm stdErr = sql: Scan error on column index 0, name "total": converting NULL to float64

gorm stdErr = sql: Scan error on column index 0, name "total": converting NULL to float64

时间:2023-09-13 23:23:19浏览次数:37  
标签:index NULL name float64 res amount sql total

前言

使用 gorm 查询时,报错:stdErr = sql: Scan error on column index 0, name "total": converting NULL to float64 is unsupported

代码如下

var total float64
res := db.Model(&model.Record{}).Select("sum(amount) as total").Where("id = ? and type = ? ", key.Id, key.Type).Find(&total)
if res.Error != nil {
return 0, errors.Errorf(res.Error, errors.ErrorDBFindFailed)
}

这个错误是因为查询结果中的 total 列的值为 NULL,而尝试将 NULL 转换为 float64 类型时发生了错误。

查询结果中的 total 列的值为 NULL 可能有多种原因:

  1. 数据库中没有匹配的记录:根据查询条件,可能没有符合条件的记录存在,因此返回的"total"列的值为 NULL。这意味着在数据库中没有与给定的 idtype 匹配的记录。
  2. amount 列的值为 NULL:如果 amount 列的值为 NULL,那么使用 SUM 函数计算总和时,结果将为 NULL。因此,total 列的值将为 NULL
  3. 数据库中存在 NULL值:如果 amount 列中存在 NULL 值,并且在查询中没有处理 NULL 值的情况,那么计算总和时将返回 NULL

解决方法

import "database/sql"

var total sql.NullFloat64
res := db.Model(&model.Record{}).Select("COALESCE(sum(amount), 0) as total").Where("id = ? and type = ? ", key.Id, key.Type).Find(&total)
if res.Error != nil {
    return 0, errors.Errorf(res.Error, errors.ErrorDBFindFailed)
}

if total.Valid {
    return total.Float64, nil
} else {
    return 0, nil 
}

在上述代码中,使用了 SQL 的 COALESCE 函数将 sum(amount) 的结果替换为0(或其他默认值)。

然后,我们检查 total.Valid 字段,如果查询结果不为 NULL ,则将其转换为 float64 类型并返回。

通过这种方式,即使查询结果中的"total"列的值为NULL,也可以正常处理,并且可以返回默认值或根据业务逻辑进行处理。

标签:index,NULL,name,float64,res,amount,sql,total
From: https://www.cnblogs.com/niuben/p/17701065.html

相关文章

  • pyinstaller 报错ImportError: No module named _bootlocale
    生成环境的安装包,执行如下命令会有报错:pyinstaller-wF-pvenv310/Scripts-pvenv310/Lib/site-packages--add-data"./fish.jpg:."--add-data"./kb.ini:."-ifish.ico-nprogram_namemain.py328INFO:PyInstaller:3.6328INFO:Python:3.10.11343INFO:......
  • [Errno 2] Unable to open file (unable to open file: name = 'data/tokenized/
    valle训练加载数据失败: [Errno2]Unabletoopenfile(unabletoopenfile:name='data/tokenized/libritts_encodec_train-other-500.h5'将路径修改为绝对路径,该问题即可解决......
  • A named channel for communicating with platform plugins using asynchronous /// m
     Future<void>initWithScopeLimitCredential()async{finalBasicMessageChannel<Object?>channel=BasicMessageChannel<Object?>('dev.flutter.pigeon.CosApi.initWithScopeLimitCredential',codec,binaryMess......
  • Vue.js的index.html文件中引入JavaScript文件
    将js文件放在public文件夹下面在index.html文件下引入js文件在前面加<%=BASE_URL%>后面加路径,如果想将本地js文件打包之后也放在static/js文件夹下,需要在public文件夹下创建一个和打包之后文件放的位置一样的文件夹<scriptsrc="<%=BASE_URL%>./static/js/js文件名"></sc......
  • Oracle 查询当前用户下所有索引(Index)并拼接创建脚本
    原文地址:https://blog.csdn.net/zy_workjob/article/details/82011825 Oracle查询当前用户下所有索引(Index,PK)并拼接创建脚本【不包含FUNCTION-BASED基于函数的索引】SELECTT.TABLE_NAME,--表名T.INDEX_NAME,--索引名I.UNIQUENESS,--是否非空I.INDEX_......
  • python中字符串内置函数find和index
     001、find>>>str1="xyabmnabkj"##测试字符串>>>foriinenumerate(str1):...print(i)##列出每个字符的索引...(0,'x')(1,'y')(2,'a')(3,'b')(4,'m'......
  • Linux 中的 /dev/null 是什么?有什么隐藏的作用?
    在Linux系统中,/dev/null是一个特殊的文件,它被称为“空设备”。它没有任何数据,读取它永远不会产生任何输出,写入它永远不会导致任何数据被存储。/dev/null起着丢弃数据的作用,可以用于一些需要忽略输出或者输入的场合。在本文中,我们将会深入了解/dev/null文件,它的作用以及如何......
  • index.html在webpack打包时动态生成index模板
    通过<%=BASE_URL%>包裹环境变量通过<%if(process.env.NODE_ENV==='production'){%><%}%>包裹条件判断<!DOCTYPEhtml><html><head><metacharset="utf-8"/><metacontent="IE=edge,chrome=1&qu......
  • 不再担心正向还是逆向查询,Vlookup函数的救星Index+Match组合!
    1职场实例我们在日常使用Excel时,遇到最多的场景便是“查找”问题,一提到“查找”,我们脑海里首先想到的肯定就是“Vlookup函数”了,但是“Vlookup函数”也有其自身的小短板,比如说遇到逆向查找的时候,使用Vlookup函数的基本语法公式时便会立马失效。那么有没有一种方法,不管正向还是逆向......
  • 【Kafka】ZooKeeper启动失败报错java.net.BindException_ Address already in use_ bi
    问题描述Kafka2.8.1ZooKeeper启动失败。zookeeper-server-start.bat../../config/zookeeper.properties[2023-09-0418:21:49,497]INFObindingtoport0.0.0.0/0.0.0.0:2181(org.apache.zookeeper.server.NIOServerCnxnFactory)[2023-09-0418:21:49,498]ERRORUnexpected......