2015-11-17 49 views
2

我想插入一行到一個MySQL表:MySQL的插入浮點32和Float64轉到

package main 

import (
    "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:[email protected]/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實例託管在同一臺服務器上運行這一點,我可以與來自終端的用戶/密碼訪問數據庫。

任何幫助?

謝謝!

+0

在你的數據庫的id字段被稱爲' 「idtemperatures」'你用' 「ID」'你的SQL語句。 – icza

+0

啊!對不起,已經很晚了。但爲什麼沒有錯誤信息?我仍然在學習Go,這是迄今爲止最令人沮喪的部分。 –

+0

缺少錯誤是因爲你使用了'DB.Query()',但你真的應該使用'DB.Exec()'。有關詳細信息,請參閱我編輯的答案。 – icza

回答

0

數據庫中的ID /主鍵字段被稱爲"idtemperatures",並且在SQL語句中使用了"id"

此外,由於您沒有執行查詢(但是INSERT),您應該使用DB.Exec()方法執行它。您絕不應該使用DB.Query()來執行DML(數據操作語言)語句。

如果無法連接到數據庫,則可能會出現超時錯誤。確保它使用默認協議(TCP)和主機(localhost:3306)。另一個原因可能是因爲您使用DB.Query()來執行您的SQL INSERT語句,並且DB.Query()返回一個*sql.Rows值,該值持有數據庫連接,直到您使用Rows.Close()方法關閉它爲止 - 您永遠不會這樣做;你甚至沒有存儲返回的db.Rows值。

此外,您應打電話db.Close()作爲推遲聲明,在打開它之後的錯誤檢查之後。

更正例如:

db, err := sql.Open("mysql", "user:[email protected]/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) 
} 
+0

不幸的是,這是行不通的。在超時發生之前,我仍然完全沒有輸出。我忘了提及我正在嘗試在armv7l架構的覆盆子pi上運行此操作。不知道這是否重要? –

+0

@DonaldJ它看起來你不能連接到數據庫。你確定它使用默認協議(TCP)和主機(localhost:3306)嗎? – icza

+0

嗯,我不確定說實話怎麼回事。我只是在一臺單獨的機器(x86_64)上進行編譯,並將其指向mysql實例的局域網地址,並且它工作正常。我將你的答案標記爲正確,我將嘗試找出本地mysql實例配置有什麼問題。謝謝! –