这里用的是windows版本,influxdb3。
influxdb是一款时序数据库,在事件记录(例如日志),监控指标,传感器数据,金融行情等场景非常合适。

时序数据库和关系数据库的对比
特性传统关系型数据库 (MySQL)时序数据库 (InfluxDB)
最佳场景用户订单、账户余额、商品库存、权限管理传感器数据、监控指标、金融行情、事件记录
数据特点数据结构复杂,需要频繁更新和关联查询数据量大、只追加不更新、按时间排序
写入性能较慢(受限于事务锁和索引更新)极快(顺序写入,无事务锁,高并发)
存储效率较低(行式存储,冗余多)极高(列式存储,自带高压缩算法)
数据生命周期需手动清理旧数据自动过期(可配置保留策略,自动删除旧数据)

操作

这一步是基于安装并已启动服务,安装见下文。

生成token

3.0版本之后需要token了。
生成token命令:

.\influxdb3.exe create token --admin --host http://localhost:8181

返回结果:

New token created successfully!

Token: 这里是token值
HTTP Requests Header: Authorization: Bearer 这里是token值

IMPORTANT: Store this token securely, as it will not be shown again.

保存好token值,后续用的到。

创建数据库
.\influxdb3.exe create database test_db --token "这里替换成你刚才复制的令牌" --host http://localhost:8181
插入数据
.\influxdb3.exe write --database test_db --token "这里是token值" --precision s "cpu,host=server01 usage=45.2 1715000001"
.\influxdb3.exe write --database test_db --token "这里是token值" --precision s "cpu,host=server01 usage=50.5 1715000002"
.\influxdb3.exe write --database test_db --token "这里是token值" --precision s "cpu,host=server02 usage=12.0 1715000003"
查询数据
.\influxdb3.exe query --database test_db --token "这里是token值" "SELECT * FROM cpu WHERE host='server01'"
如何界面化查看呢?

建议用grafana,见另外一篇笔记。
实测效果一般般,grafana是通用图形界面工具,并不是influxdb专用的,只是支持influxdb而已。

命令

–precision s # 指定时间戳数值精度,s表示秒,其他精度见后续列表

时间戳数值精度-列表
参数值单位说明典型时间戳示例 (近似)
ns纳秒InfluxDB 默认精度1715389200000000000 (19位)
u微秒百万分之一秒1715389200000000 (16位)
ms毫秒千分之一秒 (Java/JS 常用)1715389200000 (13位)
s标准 Unix 时间戳 (Python/Go 常用)1715389200 (10位)

安装并启动服务

1、打开influxdb官网下载界面,地址:https://www.influxdata.com/downloads

在这里插入图片描述
到达这个界面,继续点:
在这里插入图片描述
继续点:
在这里插入图片描述

2、下载的文件找个位置解压,双击influxdb3.exe启动服务

这样这个服务就启动了,窗口不要关闭。

token设置环境变量

每次命令中都带token太麻烦,可以设置环境变量吗?
当然可以。设置了之后就可以把token参数从命令中去掉了。

永久设置环境变量(windows)

属性 | 环境变量 | 系统环境变量,新建:
INFLUXDB3_AUTH_TOKEN # 2.0版本用INFLUX_TOKEN
值 实际的token值

临时设置环境变量

命令窗口中执行对应版本的命令即可,只对当前窗口有效:

set INFLUXDB3_AUTH_TOKEN=实际的token值 # 3.0版本
set INFLUX_TOKEN=实际的token值 # 2.0版本

3.0版本有什么变化

1、端口不是8086了,而是8181
2、需要token了
3、移除了ui界面

没有看到表名啊?

观察的很细致,实际上是有的,第一列就是,这属于默认约定。
例如:

插入语句:
.\influxdb3.exe write --database test_db --precision s "cpu,host=server01 usage=50.5 1715000002"
cpu # 就是表名,查询的时候用这个表名就行,在influxdb中叫做measurement,相当于mysql中的表名
host=server01  # 叫做tags
usage=50.5 # 叫做fields

如果表已存在,直接插入数据,如果表不存在,新建表并插入数据

数据组成

如下列表:

组成部分内容说明
Measurement
(表名)
cpu数据的分类,位于最开头,逗号之前。
Tags
(标签)
host=server01位于第一个逗号和第一个空格之间。
这是用于索引的元数据。
Fields
(字段)
usage=45.2位于第一个空格和最后一个空格之间。
这是实际存储的数值。
Timestamp
(时间戳)
1715000001位于最后,最后一个空格之后。
唯一标识是什么?

并不是单独的id,而是组合判断的。
唯一标识 = Measurement + Tags + Timestamp
如果唯一标识不存在,则新增,如果存在,则覆盖。

python连接influxdb

token值记得替换下。

代码:

from influxdb_client_3 import InfluxDBClient3
import datetime
import time

# ==========================================
# 1. 初始化配置
# ==========================================
DATABASE = "test_db"
TOKEN = "实际的token值"  # 

# 关键修改:使用完整的URL,明确指定不使用SSL
client = InfluxDBClient3(
    host="http://localhost:8181",  # 明确指定http协议
    database=DATABASE,
    token=TOKEN if TOKEN else None
)


def test_connection():
    """测试连接"""
    try:
        print("测试InfluxDB连接...")
        result = client.query("SELECT * FROM cpu LIMIT 1")
        print("✅ 连接成功!")
        print(f"查询结果: {result}")
        return True
    except Exception as e:
        print(f"❌ 连接失败: {e}")
        print(f"\n错误类型: {type(e).__name__}")
        import traceback
        traceback.print_exc()
        return False


def create_data():
    """写入数据"""
    print("\n--- 🟢 开始写入数据 ---")

    timestamp_ns = int(datetime.datetime.now().timestamp() * 1000000000)
    line = f"cpu,host=server01 usage={55.5} {timestamp_ns}"

    print(f"写入数据: {line}")

    try:
        client.write(record=line)
        print("✅ 数据写入成功!")
        time.sleep(1)
    except Exception as e:
        print(f"❌ 写入失败: {e}")
        import traceback
        traceback.print_exc()


def read_data():
    """查询数据"""
    print("\n--- 🔵 开始查询数据 ---")

    query = "SELECT * FROM cpu WHERE host='server01' ORDER BY time DESC LIMIT 10"

    try:
        table = client.query(query)

        if table:
            print(f"查询到数据:")
            print(table)
        else:
            print("未查询到数据")

    except Exception as e:
        print(f"❌ 查询失败: {e}")
        import traceback
        traceback.print_exc()


def delete_data():
    """删除数据"""
    print("\n--- 🔴 开始删除数据 ---")

    try:
        client.delete(
            predicate="host='server01'",
            start="-1h",
            stop="now()"
        )
        print("✅ 删除请求已提交")
    except Exception as e:
        print(f"❌ 删除失败: {e}")


def update_data():
    """更新数据(覆盖写)"""
    print("\n--- 🟠 模拟更新数据 ---")

    timestamp_ns = int(datetime.datetime.now().timestamp() * 1000000000)
    line = f"cpu,host=server01 usage={99.9} {timestamp_ns}"

    print(f"覆盖写入: {line}")

    try:
        client.write(record=line)
        print("✅ 覆盖写入完成")
        time.sleep(1)
    except Exception as e:
        print(f"❌ 写入失败: {e}")


if __name__ == "__main__":
    print("=" * 50)
    print("InfluxDB 3.0 测试")
    print("=" * 50)

    if not test_connection():
        print("\n请先确认:")
        print("1. InfluxDB服务是否启动")
        print("2. 运行: .\\influxdb3.exe query --database test_db \"SELECT * FROM cpu LIMIT 1\"")
        exit(1)

    try:
        create_data()
        read_data()
        update_data()
        read_data()
        delete_data()
    except Exception as e:
        print(f"\n执行出错: {e}")
        import traceback

        traceback.print_exc()
    finally:
        client.close()
        print("\n连接已关闭")
遇到的问题?

试了好几次,总是带有443端口,所以连不上。
改为直接指定具体http地址,问题解决了。

报错

报错 Write command failed: ensure that a single protocol line string is provided as the final argument, enclosed in quotes

插入数据时报的这个错。

解决方案:
单引号改为双引号问题解决。

文档

influxdb官网下载界面:
https://www.influxdata.com/downloads

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐