转载请注明出处:
使用 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 数据库进行正确的交互。