InfluxDB官方支持的client库有Arduino, C#, Go, Java, JavaScript, PHP, Python, Ruby. 可以通过连接https://docs.influxdata.com/influxdb/v1.8/tools/api_client_libraries/ 获得说明。
这里介绍Python版本的使用。
1 下载安装
通过github https://github.com/influxdata/influxdb-client-python下载代码包,
Influxdb-client-python库支持influxdb v1.8和v2.0版本,使用Flux 操作接口。
如果想使用InfluxQL操作接口,请使用influxdb-python(https://github.com/influxdata/influxdb-python)库。 根据实际的使用经验,Flux比InfluxQL方便很多,推荐使用新版本。
下载之后,运行:
>sudo python3 setup.py install
就可以安装成功。
2 使用
首先需要打开Flux功能。
在配置文件influxdb.conf 的[http]部分,将flux-enabled 选项置为true。然后重启Influxdb数据库(sudo systemctl restart influxdb)
influxdb.conf
# ...
[http]
# ...
flux-enabled = true
# ...
2.1 写入数据库
写入数据是比较简单的,例子如下:
import codecs
from datetime import datetime
from influxdb_client import WritePrecision, InfluxDBClient, Point
from influxdb_client.client.write_api import SYNCHRONOUS
bucket = "my-bucket"
client = InfluxDBClient(url="http://localhost:8086", token="my-token", org="my-org")
write_api = client.write_api(write_options=SYNCHRONOUS)
p = Point("my_measurement").tag("location", "Prague").field("temperature", 25.3).time(datetime.now(), WritePrecision.MS)
# write using point structure
write_api.write(bucket=bucket, record=p)
2.2 查询数据库
查询数据有好几种方法,主要是返回的数据结构不同,分为:
Table structure,stream, csv 和Pandas DataFrame。
from influxdb_client import InfluxDBClient, Point, Dialect
from influxdb_client.client.write_api import SYNCHRONOUS
client = InfluxDBClient(url="http://localhost:8086", token="my-token", org="my-org")
write_api = client.write_api(write_options=SYNCHRONOUS)
query_api = client.query_api()
"""
Prepare data
"""
_point1 = Point("my_measurement").tag("location", "Prague").field("temperature", 25.3)
_point2 = Point("my_measurement").tag("location", "New York").field("temperature", 24.3)
write_api.write(bucket="my-bucket", record=[_point1, _point2])
"""
Query: using Table structure
"""
tables = query_api.query('from(bucket:"my-bucket") |> range(start: -10m)')
for table in tables:
print(table)
for record in table.records:
print(record.values)
print()
print()
"""
Query: using Stream
"""
records = query_api.query_stream('from(bucket:"my-bucket") |> range(start: -10m)')
for record in records:
print(f'Temperature in {record["location"]} is {record["_value"]}')
"""
Interrupt a stream after retrieve a required data
"""
large_stream = query_api.query_stream('from(bucket:"my-bucket") |> range(start: -100d)')
for record in large_stream:
if record["location"] == "New York":
print(f'New York temperature: {record["_value"]}')
break
large_stream.close()
print()
print()
"""
Query: using csv library
"""
csv_result = query_api.query_csv('from(bucket:"my-bucket") |> range(start: -10m)',
dialect=Dialect(header=False, delimiter=",", comment_prefix="#", annotations=[],
date_time_format="RFC3339"))
for csv_line in csv_result:
if not len(csv_line) == 0:
print(f'Temperature in {csv_line[9]} is {csv_line[6]}')
print()
print()
"""
Query: using Pandas DataFrame
"""
data_frame = query_api.query_data_frame('from(bucket:"my-bucket") '
'|> range(start: -10m) '
'|> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value") '
'|> keep(columns: ["location", "temperature"])')
print(data_frame.to_string())
"""
Close client
"""
client.__del__()