为了账号安全,请及时绑定邮箱和手机立即绑定

MySQL 插入 Float32 和 Float64 Go

MySQL 插入 Float32 和 Float64 Go

Go
陪伴而非守候 2021-11-22 16:54:22
我正在尝试在 MySQL 表中插入一行:package mainimport (    "strconv"    "io/ioutil"    "strings"    "os/exec"    "database/sql"    _ "github.com/go-sql-driver/mysql")func main() {    temp_cpu := getCPUTemp() // returns float32    temp_gpu := getGPUTemp() // returns float64    db, err := sql.Open("mysql", "user:pass@/sysStats")    handleError(err)    _, err = db.Query("INSERT INTO temperatures (id, cpu, gpu, timestamp) VALUES (?, ?, ?, ?)", 1, temp_gpu, temp_cpu, time.Now())    handleError(err)    db.Close()    return}它成功构建,但是当我运行生成的二进制文件时,它会在很长时间后超时并出现通用超时错误。该表具有以下架构:+----------------+-----------+------+-----+---------+-------+| Field          | Type      | Null | Key | Default | Extra |+----------------+-----------+------+-----+---------+-------+| idtemperatures | int(11)   | NO   | PRI | NULL    |       || cpu            | float     | YES  |     | NULL    |       || gpu            | float     | YES  |     | NULL    |       || timestamp      | timestamp | YES  |     | NULL    |       |+----------------+-----------+------+-----+---------+-------+我在托管 MySQL 实例的同一台服务器上运行它,我可以从终端使用用户/密码访问数据库。有什么帮助吗?
查看完整描述

1 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

您的数据库中的 id / 主键字段被调用"idtemperatures"并"id"在您的 SQL 语句中使用。


此外,由于您不是在执行查询(而是INSERT),因此您应该使用DB.Exec()方法来执行它。您永远不应该使用DB.Query() 来执行 DML(数据操作语言)语句。


如果您无法连接到您的数据库,您可能会收到超时错误。确保它使用默认协议 (TCP) 和主机 (localhost:3306)。另一个原因可能是因为您曾经DB.Query()执行过 SQLINSERT语句,并DB.Query()返回一个*sql.Rows保存数据库连接的值,直到您使用该Rows.Close()方法关闭它——而您从未这样做过;你甚至没有存储返回的db.Rows值。


此外,您应该db.Close()在打开它后进行错误检查后立即调用作为延迟语句。


更正的例子:


db, err := sql.Open("mysql", "user:pass@/sysStats")

if err != nil {

    fmt.Println("Failed to open DB:", err)

    return

}

defer db.Close()


s := "INSERT INTO temperatures (idtemperatures, cpu, gpu, timestamp) VALUES (?, ?, ?, ?)"

res, err = db.Exec(s, 1, temp_gpu, temp_cpu, time.Now())


if err != nil {

    fmt.Println("Failed to execute INSERT:", err)

} else {

    n, err := res.RowsAffected()

    fmt.Println("INSERT executed, rows affected: ", n, err)

}


查看完整回答
反对 回复 2021-11-22
  • 1 回答
  • 0 关注
  • 290 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信