golang读取数据库null值时,出现数据与上一条数据相同,导致数据不准确现象

1、示例1 读取null值错误情况

package main
import (
    "database/sql"
    "fmt"
    "log"
    _ "test_mysql4/mysql-1.4"
)
var db *sql.DB
// 声明一个user结构体
type boot struct {
    erp_product_model string
    mylen             string
    problems          string
    id                int
}
func initDB() (err error) {
    dsn := "test5:test5@tcp(172.16.3.xxx:3306)/xxx?charset=utf8&parseTime=True&allowOldPasswords=1"
    db, err = sql.Open("mysql", dsn) // 打开一个数据库连接,不会校验用户名和密码是否正确
    if err != nil {
        return err
    }
    err = db.Ping() //此时验证数据库是否连接成功
    if err != nil {
        return err
    }
    return
}
// 连接mysql示例
func main() {
    err := initDB() // 连接数据库
    if err != nil {
        log.Println("数据库连接失败", err)
        return
    }
    fmt.Println("数据库连接成功")
    s := "SELECT eqpt_no, repair_name, problems, id FROM repair_record WHERE finish_time>DATE_SUB(CURDATE(),INTERVAL 2 DAY)"
    r, err := db.Query(s)
    var b boot
    defer r.Close()
    if err != nil {
        fmt.Printf("err: %v\n", err)
    } else {
        for r.Next() {
            r.Scan(&b.erp_product_model, &b.mylen, &b.problems, &b.id)
            fmt.Println(b)
        }
    }
    defer r.Close()
}

2、示例1执行结果

在这里插入图片描述

在这里插入图片描述

3、示例2 读取null值正确情况

package main
import (
    "database/sql"
    "fmt"
    "log"
    _ "test_mysql4/mysql-1.4"
)
var db *sql.DB
// 声明一个user结构体
type boot struct {
    erp_product_model string
    mylen             sql.NullString
    problems          string
    id                int
}
func initDB() (err error) {
    dsn := "test5:test5@tcp(172.16.3.xxx:3306)/xxx?charset=utf8&parseTime=True&allowOldPasswords=1"
    db, err = sql.Open("mysql", dsn) // 打开一个数据库连接,不会校验用户名和密码是否正确
    if err != nil {
        return err
    }
    err = db.Ping() //此时验证数据库是否连接成功
    if err != nil {
        return err
    }
    return
}
// 连接mysql示例
func main() {
    err := initDB() // 连接数据库
    if err != nil {
        log.Println("数据库连接失败", err)
        return
    }
    fmt.Println("数据库连接成功")
    s := "SELECT eqpt_no, repair_name, problems, id FROM repair_record WHERE finish_time>DATE_SUB(CURDATE(),INTERVAL 2 DAY)"
    r, err := db.Query(s)
    var b boot
    defer r.Close()
    if err != nil {
        fmt.Printf("err: %v\n", err)
    } else {
        for r.Next() {
            r.Scan(&b.erp_product_model, &b.mylen, &b.problems, &b.id)
            fmt.Println(b)
        }
    }
    defer r.Close()
}

4、示例2执行结果

在这里插入图片描述

在这里插入图片描述

5、解决办法
定义结构体时,把可能为null值的字段定义为sqlNullxxx
本例子中把 mylen string 修改为 mylen sql.NullString

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值