如何使用Golang将值插入十进制(65,0)并从数据库中检索它们?

时间:2018-07-26 09:54:56

标签: mysql go

我是Go的新手。 我正在使用github.com/go-sql-driver/mysql作为驱动程序 我有一个表,其中有许多列,数据类型为decimal(65,0)。 我正在尝试使用big.Int在我的应用程序中处理这些值,这对我来说似乎很合理。 但是,我找不到使用Stmt.Exec将值插入数据库的方法。 它说

  

“ sql:转换参数$ 2类型:不支持的类型big.Int,结构”

我也找不到将其从mysql序列化回我的Go结构的方法。

1 个答案:

答案 0 :(得分:1)

对SQL语句使用字符串值。与*big.Int值之间进行转换。例如,

package main

import (
    "fmt"
    "log"
    "math/big"

    "database/sql"
    _ "github.com/go-sql-driver/mysql"
)

func printN(rows *sql.Rows) {
    for rows.Next() {
        var n *big.Int
        var s sql.NullString
        err := rows.Scan(&s)
        if err != nil {
            log.Print(err)
        }
        n, _ = new(big.Int).SetString(s.String, 10)
        fmt.Printf("n: %v\n", n.String())
    }
    err := rows.Err()
    if err != nil {
        log.Print(err)
    }
}

func main() {
    db, err := sql.Open("mysql", "peter:@/so")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    query := `SELECT n from so.dec65;`
    rows, err := db.Query(query)
    if err != nil {
        log.Fatal(err)
    }
    printN(rows)

    query = `SELECT n from so.dec65 WHERE n < ?;`
    arg1, ok := new(big.Int).SetString("12345678901234567891234567", 10)
    if ok {
        rows, err = db.Query(query, arg1.String())
        if err != nil {
            log.Fatal(err)
        }
        printN(rows)
    }
}

数据库:

mysql> DESCRIBE dec65;
+-------+---------------+------+-----+---------+-------+
| Field | Type          | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| n     | decimal(65,0) | YES  |     | NULL    |       |
+-------+---------------+------+-----+---------+-------+
mysql> SELECT n FROM dec65;
+-----------------------------+
| n                           |
+-----------------------------+
|  12345678901234567891234567 |
| -12345678901234567891234567 |
|                        NULL |

+ ----------------------------- +

输出:

n: 12345678901234567891234567
n: -12345678901234567891234567
n: <nil>
n: -12345678901234567891234567