doushan7077 2018-07-26 09:54
浏览 45
已采纳

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

I am relatively new to Go. I am using github.com/go-sql-driver/mysql as my driver I have a table with many columns with data types of decimal(65,0). I am trying to use big.Int to handle these values in my application which seems reasonable to me. However I cannot find a way to insert the value in to database using Stmt.Exec. It says

"sql: converting argument $2 type: unsupported type big.Int, a struct"

Also I also could not find a way to serialize it back from mysql to my Go struct.

  • 写回答

1条回答 默认 最新

  • doutang2382 2018-07-27 02:48
    关注

    Use string values for SQL statements. Convert to and from *big.Int values. For example,

    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.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)
        }
    }
    

    Database:

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

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

    Output:

    n: 12345678901234567891234567
    n: -12345678901234567891234567
    n: <nil>
    n: -12345678901234567891234567
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)