我是Go的新手。
我正在使用github.com/go-sql-driver/mysql作为驱动程序
我有一个表,其中有许多列,数据类型为decimal(65,0)
。
我正在尝试使用big.Int在我的应用程序中处理这些值,这对我来说似乎很合理。
但是,我找不到使用Stmt.Exec
将值插入数据库的方法。
它说
“ sql:转换参数$ 2类型:不支持的类型big.Int,结构”
我也找不到将其从mysql序列化回我的Go结构的方法。
答案 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