我正在从 influxdb-client-python
代码库运行脚本
example.py。它运行数据点并将其写入本地 influxDB 实例,仅用于测试和学习目的。 据我了解,这个脚本应该以两种不同的方式编写一个点:使用
line_protocol
(字符串)和 Point
数据结构。
我对 Point
数据结构没有任何问题;然而,line_protocol
在1970年2月的某个地方写了一个点。恐怕这是WritePrecision的问题。也许在使用转换为 Datetime
的 line_protocol
对象时不应该指定它?
有人可以确认这种行为(如果这不是我这边的错误)并且这是预期的吗?非常感谢。
嗨,我有几个想法:
Point 对象行为:使用 Point 数据结构时,可以使用 datetime.now(tz=timezone.utc) 和 WritePrecision.MS 指定时间戳。 Point 对象确保时间戳以毫秒为单位正确格式化(自 Unix 纪元以来),正如 InfluxDB 所要求的。
line_protocol 行为:当您调用 p.to_line_protocol() 时,Point 对象中的时间戳已经转换为毫秒。但是,当您直接使用 write_api.write() 写入此字符串时,InfluxDB 假定时间戳以纳秒为单位(默认精度),除非您另外指定。
如果在此写入操作期间未指定 WritePrecision,则时间戳将被误解,导致日期为 1970 年 2 月(Unix 纪元时间戳不匹配的典型症状)。
解决方案:在写入line_protocol字符串时,需要显式指定WritePrecision以匹配line_protocol中使用的时间戳格式。
请测试一下:
enter code here
write_api.write(bucket="my-bucket", record=line_protocol,
write_precision=WritePrecision.MS)
这可确保 InfluxDB 将 line_protocol 字符串中的时间戳正确解释为毫秒。 另外,当使用 Point 对象时,WritePrecision 是在内部管理的,因此不会出现问题。对于直接 line_protocol 写入,您必须始终确保 write_ precision 参数与时间戳的格式匹配。此行为是预期行为,而不是 InfluxDB 客户端库中的错误。这只是在使用 line_protocol 字符串时正确指定 WritePrecision 的问题。 祝你好运