繁体   English   中英

使用Go和数据库/ SQL扫描nil float值时出错

[英]Error with scan of nil float value using Go and database/sql

我正在编写一个程序,需要在对该表进行一些插入和更新之前确定该表的打开值。 该表(本例中为PostgreSql)最初可能有零行。 当我选择期初值时,如果行数为零,则余额的总计返回为nil。 这将导致扫描失败并显示以下消息:

Error on scan of test01 opening Row Count. Error = sql: Scan error on column
index 1: converting string "<nil>" to a float64: strconv.ParseFloat:
parsing "<nil>": invalid syntax

虽然我可以通过以下两种选择来“解决”问题,但如果行数超过零,则可以一次选择COUNT(*),另一次选择SUM()余额,但这似乎不是一个很好的解决方案,而且可能并不总是这样解决此问题,并且选择的两个值(行数和余额总数)不在同一时间点。

有一种方法可以解决此问题,只需选择一个表?

下面是一个说明问题的小型测试程序。 当表中有选定的行时,程序运行正常。 但是,如果行数为零,则会发生上述错误。

测试程序示例:

package main

import (
    "database/sql"
    "fmt"
    _ "github.com/lib/pq"
)

var db *sql.DB

func main() {
    var err error

    db, err = sql.Open("postgres",
              "user=test dbname=testdb password=test sslmode=disable")
    if err != nil {
        fmt.Sprintf("Failed to open Db Connection. Error = %s\n", err)
        return
    }

    defer fCloseDb()

    var row *sql.Row
    var sSql string = "SELECT COUNT(*), SUM(dbalance) FROM test01"
    if row = db.QueryRow(sSql); row == nil {
        println("No row returned selecting opening count(*) from test01")
        return
    }

    var iRowCount int64 = 0
    var fBalTot float64 = 0.00

    if err = row.Scan(&iRowCount, &fBalTot); err != nil {
        fmt.Printf("Error on scan of test01 opening Row Count. Error = %s\n", err)
        return
    }

    fmt.Printf("Row Count = %d, Balance total value = %.2f\n", iRowCount, fBalTot)
}

func fCloseDb() {
    if db != nil {
        db.Close()
        println("Db Closed")
    }
}

该表的结构如下:

sSql = "CREATE TABLE IF NOT EXISTS test01 " +
       "(ikey SERIAL Primary Key, " +
       "sname varchar(22) not null, " +
       "dbalance decimal(12,2) not null)"

非常感谢,这项工作奏效了:

"SELECT COUNT(*), coalesce(SUM(dbalance), 0.00) FROM test01"

我认为合并返回第一个非空值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM