python influxDB 基本操作

Posted smile-yan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python influxDB 基本操作相关的知识,希望对你有一定的参考价值。

问题描述

使用 python 编写脚本向 influxDB 1.x 版本中读数据、写数据等。

一定注意 influxDB 的版本问题,官方提供的 python client 例子大多数对于 2.x 版本的,请注意区分。

安装依赖

请确定本地安装好此依赖后进行后面的操作。

$ pip install influxdb

本地安装 influxDB 1.x

若已经安装 influxDB 请跳过此步骤。

前往官网下载 influxDB 1.x https://portal.influxdata.com/downloads/,根据自己的实际情况选择相应的平台。

创建 database

from influxdb import InfluxDBClient


if __name__ == '__main__':
    host, port = "localhost", 8086
    # 如果没有开启用户名和密码,则不需要填写这两个参数
    username, password = "root", "123"
    database = "test_mlops_baselina"
    client = InfluxDBClient(host=host, username=username, port=port, database=database, password=password)
    client.create_database("test_hello_world")
    client.close()

运行后可以通过客户端软件查看增加的这个数据库,如图所示

删除数据库(一定要谨慎!!!)

from influxdb import InfluxDBClient


if __name__ == '__main__':
    host, port = "localhost", 8086
    # 如果没有开启用户名和密码,则不需要填写这两个参数
    username, password = "root", "123"
    database = "test_mlops_baselina"
    client = InfluxDBClient(host=host, username=username, port=port, database=database, password=password)
    client.drop_database("test_hello_world")
    client.close()

添加 meaturement 以及序列

类似于mysql中的表,但是不同之处在于 mysql 一般是先创建表,再去添加字段,而这里直接就是一起了,一般会考虑把序列处理好以后,一次性写入。

概念MySQLInfluxDB
数据库(同)databasedatabase
表(不同)tablemeasurement
列(不同)column(需要自定义索引)tag (带索引,非必须)、field(不带索引)、timestemp(唯一主键)
from influxdb import InfluxDBClient


if __name__ == '__main__':
    host, port = "localhost", 8086
    username, password = "root", "123"
    database = "test_hello_world"
    client = InfluxDBClient(host=host, username=username, port=port, database=database, password=password)

    points = [
        
            'measurement': 'table1',
            'tags': 
                'host': 'server01',
                'region': 'us-west'
            ,
            'time': '2022-10-24T12:00:00Z',
            'fields': 
                'value': 0.64
            
        ,
        
            'measurement': 'table1',
            'tags': 
                'host': 'server01',
                'region': 'us-west'
            ,
            'time': '2022-10-24T13:00:00Z',
            'fields': 
                'value': 0.88
            
        
    ]

    client.write_points(points, database=database)
    client.close()



为了方便接下来的测试效果,我对上面的代码中 json 部分做了一定的修改,更改其中 measurement 为 table2,重新运行一下效果如图:

获取所有的 measurements

这里需要添加 header ,避免出现以下问题:

requests.exceptions.ContentDecodingError: 
('Received response with content-encoding: gzip, but failed to decode it.', 
error('Error -3 while decompressing data: incorrect header check'))
from influxdb import InfluxDBClient


if __name__ == '__main__':
    host, port = "localhost", 8086
    username, password = "root", "123"
    database = "test_hello_world"
    headers = 
        'User-Agent': 'python-requests/2.24.0',
        'Accept': '*/*',
        'Connection': 'keep-alive',
        'Content-Type': 'application/json',
        'Authorization': 'Basic cm9vdDpyb290'
    
    client = InfluxDBClient(host=host, username=username, port=port, database=database, password=password,
                            headers=headers)
    print(client.get_list_measurements())
    client.close()

输出内容为:

['name': 'table1', 'name': 'table2']

获取某一个 measurement 中的某一列值

这个过程类似于 mysql 中确定 database 以后,再确定哪一张表,然后再找到对应的某一列属性。

from influxdb import InfluxDBClient


if __name__ == '__main__':
    host, port = "localhost", 8086
    username, password = "root", "123"
    database = "test_hello_world"
    headers = 
        'User-Agent': 'python-requests/2.24.0',
        'Accept': '*/*',
        'Connection': 'keep-alive',
        'Content-Type': 'application/json',
        'Authorization': 'Basic cm9vdDpyb290'
    
    client = InfluxDBClient(host=host, username=username, port=port, database=database, password=password,
                            headers=headers)
    sql = "SELECT value FROM table1"
    print(list(client.query(sql).get_points()))
    client.close()

输出的结果为:

['time': '2022-10-24T12:00:00Z', 'value': 0.64, 'time': '2022-10-24T13:00:00Z', 'value': 0.88]

类似的更多 sql 语句自行拼写就好了,这里不再列举与 sql 相关的例子,包括多条件查询等等。

当然 select * from … 也是可以的。

总结

可以类比 mysql 来熟悉 influxDB ,总体而言不算复杂,并且随着大家对时序数据的关注,可能会存在越来越多的类似的开源框架,根据实际需求选择,并且熟悉官方文档,多查阅资料,这都是常规操作。

Smileyan
2022.10.27 00:03

以上是关于python influxDB 基本操作的主要内容,如果未能解决你的问题,请参考以下文章

python influxDB 基本操作

influxdb 中的查询和高级操作

JMeter - 实时结果 - InfluxDB和Grafana - 第1部分 - 基本设置

Python InfluxDB2 - write_api.write(...) 如何检查是不是成功?

InfluxDB安装与简易使用指南

InfluxDB安装与简易使用指南