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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

smile-yan

感谢您的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值