golang gorm 计算字段和获取sum()值的实现

计算表lb_ytt_user_money_log 中,字段money的和

代码如下:

var total_money []int
sqlstr := `select
 SUM(money) as total_money
 from
 lb_ytt_user_money_log
 where
 user_id = ? and l_type = 1 and status=1 and (create_time> ? and create_time <= ?)`
Db.Raw(sqlstr, userID, beginTimeNum, endTimeNum).Pluck("SUM(money) as total_money", &total_money)

Pluck

将模型中的单个列作为地图查询,如果要查询多个列,可以使用Scan

Db.Raw(sqlstr, userID, beginTimeNum, endTimeNum).Pluck("SUM(money) as total_money", &total_money)

如果把Db.Pluck换成Db.scan得出的就是0

补充:golang gorm 解决mysql sum函数列有null时 报错 sconverting NULL to int64 is unsupported

当我们查询orders表order_amount字段的和时,如果order_amount字段有null值,则gorm会报错sql:

Scan error on column index 0, name "sum(order_amount)": converting NULL to int64 is unsupported

var price int64

db.Table("orders").Select("sum(order_amount)").Scan(&price)

解决方法:

使用gorm的Pluck 从数据库查询单个列,并将结果扫描到切片,在循环取出值计算总和,这样即使有null值,也能正确计算和,不会因为sum函数的机制导致报错

//创建一个存储查询结果的切片
var result []int64
var sum int64
db.Table("orders").Pluck("order_amount",&result )
for _,v := range result{
 sum += v
 }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • golang gorm 操作mysql及gorm基本用法

    golang 官方的那个操作mysql的有点麻烦所以就使用了gorm,下面就gorm的使用做下简单介绍 下载gorm: go get -u github.com/jinzhu/gorm 在项目中引入gorm: import ( "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" ) 定义db连接信息 func DbConn(MyUser, Password, Host, Db stri

  • gorm golang 并发连接数据库报错的解决方法

    底层报错 error:cannot assign requested address 原因 并发场景下 client 频繁请求端口建立tcp连接导致端口被耗尽 解决方案 root执行即可 sysctl -w net.ipv4.tcp_timestamps=1 开启对于TCP时间戳的支持,若该项设置为0,则下面一项设置不起作用 sysctl -w net.ipv4.tcp_tw_recycle=1 表示开启TCP连接中TIME-WAIT sockets的快速回收 以上这篇gorm golang 并

  • golang gorm中格式化时间问题详解

    前言 最近在开发项目时遇到了发现一个问题, gorm虽然可以自动帮你维护 created_at.updated_at.deleted_at这些关键时间字段.但是其原理与弊端需要了解一下. 1.使用方法 通过自定义一个localtime的结构,来控制时间的格式 package utils import ( "time" //"strconv" "fmt" "database/sql/driver" "strconv&q

  • golang gorm多条件筛选查询操作

    案例: 查看陌陌的动态,依次可以按照发布时间,性别,城市进行筛选 如图进行筛选 gorm链式操作 Method Chaining,Gorm 实现了链式操作接口,所以你可以把代码写成这样: // 创建一个查询 tx := db.Where("name = ?", "jinzhu") // 添加更多条件 if someCondition { tx = tx.Where("age = ?", 20) } else { tx = tx.Where(&qu

  • golang常用库之操作数据库的orm框架-gorm基本使用详解

    golang常用库:gorilla/mux-http路由库使用 golang常用库:配置文件解析库-viper使用 golang常用库:操作数据库的orm框架-gorm基本使用 一:字段映射-模型定义 gorm中通常用struct来映射字段. gorm教程中叫模型定义 比如我们定义一个模型Model: type User struct { gorm.Model UserId int64 `gorm:"index"` //设置一个普通的索引,没有设置索引名,gorm会自动命名 Birth

  • golang gorm 计算字段和获取sum()值的实现

    计算表lb_ytt_user_money_log 中,字段money的和 代码如下: var total_money []int sqlstr := `select SUM(money) as total_money from lb_ytt_user_money_log where user_id = ? and l_type = 1 and status=1 and (create_time> ? and create_time <= ?)` Db.Raw(sqlstr, userID, b

  • python计算Content-MD5并获取文件的Content-MD5值方式

    1.首先计算MD5加密的二进制数组(128位),然后再对这个二进制数组进行base64编码(而不是对32位字符串编码). 例如,用Python计算0123456789的Content-MD5,主要代码如下: import base64, hashlib hash = hashlib.md5() hash.update("0123456789") base64.b64encode(hash.digest()) 这样就生成了 'eB5eJF1ptWaXm4bijSPyxw==' 的Cont

  • golang gorm的预加载及软删硬删的数据操作示例

    目录 1. orm读写数据 1. 创建 1.1. 创建记录 1.2. 默认值 1.3. 在Callbacks中设置主键 1.4. 扩展创建选项 2. 查询 2.1. Where查询条件 (简单SQL) 2.2. Where查询条件 (Struct & Map) 2.3. Not条件查询 2.4. 带内联条件的查询 2.5. Or条件查询 2.6. 查询链 2.7. 扩展查询选项 2.8. FirstOrInit 2.9. Attrs 2.10. Assign 2.11. FirstOrCreat

  • golang Gorm框架讲解

    目录 1.gorm介绍 1.1介绍 1.2安装 2.使用 2.1创建表 2.2.添加数据 2.3.查询数据 2.4更新数据 2.5删除数据 2.6执行原生sql 3.一对一 3.1创建表 3.2多态关联 3.3外键约束 4.一对多 5.多对多 6.获取多表数据 1.gorm介绍 1.1介绍 全功能 ORM 关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承) Create,Save,Update,Delete,Find 中钩子方法 支持 Pr

  • C# List集合中获取重复值及集合运算详解

    话不多说,直接上实例: 一.获取集合内重复值 public void GetDuplicateValue() { List<string> lisA = new List<string> { "A", "B", "C", "A" }; //方式一 借助字典 Dictionary<string, int> dic = new Dictionary<string, int>(); l

  • golang gorm的Callbacks事务回滚对象操作示例

    目录 1. Callbacks 1.1. 创建对象 1.2. 更新对象 1.3. 删除对象 1.4. 查询对象 1.5. 回调示例 1. Callbacks 您可以将回调方法定义为模型结构的指针,在创建,更新,查询,删除时将被调用,如果任何回调返回错误,gorm将停止未来操作并回滚所有更改. 1.1. 创建对象 创建过程中可用的回调 // begin transaction 开始事物 BeforeSave BeforeCreate // save before associations 保存前关

  • golang gorm模型结构体的定义示例

    目录 1. 模型 1.1. 模型定义 2. 约定 2.1. gorm.Model 结构体 2.2. 表名是结构体名称的复数形式 2.3. 更改默认表名 2.4. 列名是字段名的蛇形小写 2.5. 字段ID为主键 2.6. 字段CreatedAt用于存储记录的创建时间 2.7. 字段UpdatedAt用于存储记录的修改时间 2.8. 字段DeletedAt用于存储记录的删除时间,如果字段存在 1. 模型 1.1. 模型定义 type User struct { gorm.Model Birthda

  • golang gorm错误处理事务以及日志用法示例

    目录 1. 高级用法 1.1. 错误处理 1.2. 事物 1.2.1. 一个具体的例子 1.3. SQL构建 1.3.1. 执行原生SQL 1.3.2. sql.Row & sql.Rows 1.3.3. 迭代中使用sql.Rows的Scan 1.4. 通用数据库接口sql.DB 1.4.1. 连接池 1.5. 复合主键 1.6. 日志 1.6.1. 自定义日志 1. 高级用法 1.1. 错误处理 执行任何操作后,如果发生任何错误,GORM将其设置为*DB的Error字段 if err := d

  • golang gorm更新日志执行SQL示例详解

    目录 1. 更新日志 1.1. v1.0 1.1.1. 破坏性变更 gorm执行sql 1. 更新日志 1.1. v1.0 1.1.1. 破坏性变更 gorm.Open返回类型为*gorm.DB而不是gorm.DB 更新只会更新更改的字段 大多数应用程序不会受到影响,只有当您更改回调中的更新值(如BeforeSave,BeforeUpdate)时,应该使用scope.SetColumn,例如: func (user *User) BeforeUpdate(scope *gorm.Scope) {

  • golang时间及时间戳的获取转换

    目录 一.获取时间 1.1 获取当前时间 1.2 获取之前/之后的时间 获取1分钟之前的时间戳 获取一小时之前的时间 获取1小时后的时间 二.获时间戳 2.1 获取当前时间戳 2.2 时间转时间戳 2.2 时间戳转时间 按模板格式化输出 模板输出当前时间 3. 时间计算 3.1 时间加时间段 3.2 计算两时间之差 一.获取时间 1.1 获取当前时间 代码实现 package main import (         "fmt"         "time" )

随机推荐