轉載請註明出處:
使用 github.com/influxdata/influxdb/client/v2
依賴包向 InfluxDB 寫入資料的範例程式碼:
package main
import (
"fmt"
"log"
"time"
"github.com/influxdata/influxdb/client/v2"
)
const (
MyDB = "mydb"
username = ""
password = ""
)
func main() {
c, err := client.NewHTTPClient(client.HTTPConfig{
Addr: "http://localhost:8086",
Username: username,
Password: password,
})
if err != nil {
log.Fatal(err)
}
defer c.Close()
bp, err := client.NewBatchPoints(client.BatchPointsConfig{
Database: MyDB,
Precision: "s", // 時間戳精度,例如:"s"表示秒,"ms"表示毫秒
})
if err != nil {
log.Fatal(err)
}
tags := map[string]string{"tag1": "value1", "tag2": "value2"}
fields := map[string]interface{}{
"value": 10.4,
}
pt, err := client.NewPoint(
"measurement_name",
tags,
fields,
time.Now(),
)
if err != nil {
log.Fatal(err)
}
bp.AddPoint(pt)
err = c.Write(bp)
if err != nil {
log.Fatal(err)
}
fmt.Println("Data written to InfluxDB successfully!")
}
1.為了提高寫入效能,建議使用 client.NewBatchPoints
建立一個批次寫入物件(BatchPoints)。將各個資料點新增到 BatchPoints 物件中,並使用 c.Write
方法一次性將整個批次寫入傳送給 InfluxDB。
2.時間戳和精度:在建立資料點時,可以指定時間戳。確保時間戳是有效的,並且按照正確的時間戳格式提供。還要注意選擇合適的時間戳精度,例如秒("s")或毫秒("ms"),以便與 InfluxDB 中定義的時間戳精度匹配。
3.欄位型別:根據你在 InfluxDB 資料庫中定義的欄位型別,確保傳遞給資料點的欄位值型別是正確的。如果欄位型別不匹配,可能會導致解析錯誤。
4.標籤和欄位:在建立資料點時,可以指定標籤(tags)和欄位(fields)。標籤用於標識和過濾資料,而欄位包含真實的資料值。確保傳遞給資料點的標籤和欄位的名稱和值是正確的。
5.錯誤處理:在程式碼中進行適當的錯誤處理,例如檢查函數返回的錯誤並採取相應的措施,比如紀錄檔記錄或錯誤處理。
在 開發過程中遇到 寫資料到influxdb 報錯:unable to parse points ,總結下自己的踩坑原因: 由於我在 封裝 fields 時,使用的資料型別是 int 與 *big.Int,在寫資料庫時解析不了,丟擲異常 unable to parse points。
相關型別的儲存與轉換總結:
整數型別:InfluxDB 支援的整數型別是 int64
。如果你的 Go 變數是 int
型別或其他整數型別(如 int8
、int16
、int32
),則需要將其轉換為 int64
型別。
浮點數型別:InfluxDB 支援的浮點數型別是 float64
。如果你的 Go 變數是 float32
或其他浮點數型別,則需要將其轉換為 float64
型別。
布林型別:InfluxDB 支援布林型別。如果你的 Go 變數是 bool
型別,則不需要進行任何轉換。
字串型別:InfluxDB 支援字串型別。如果你的 Go 變數是 string
型別,則不需要進行任何轉換。
大整數型別:如果你在處理大整數時使用了 big.Int
型別,你可能需要將其轉換為適當的型別,以便與 InfluxDB 的欄位型別匹配。例如,可以使用 int64
或字串來表示大整數。
確保根據 InfluxDB 資料庫中定義的欄位型別和資料模型來選擇正確的型別,並根據需要進行必要的型別轉換。這樣可以避免在寫入資料時出現型別不匹配的錯誤。
同時,還應注意使用正確的時間戳精度(例如秒、毫秒等)和正確的時間格式,以便在寫入資料時與 InfluxDB 資料庫進行正確的互動。