IoTDB Python原生接口全攻略:从基础读写到高级实战

IoTDB Python原生接口全攻略:从基础读写到高级实战

做IoTDB时序数据开发的小伙伴,用Python对接肯定是高频需求,IoTDB官方的Python原生接口封装得特别友好,不管是基础的数据库连接、数据读写,还是高级的连接池管理、SSL加密、Pandas适配,全都能实现。今天就从环境搭建、基础使用,到DDL/DML操作、高级特性,再到测试和DBAPI适配,把IoTDB Python原生接口的用法一次性讲透,新手也能直接上手开发。

一、前期准备:安装依赖与包

用IoTDB Python原生接口前,得先装好两个核心依赖,一步到位不踩坑:

  1. 安装thrift框架(要求版本≥0.13),是IoTDB底层的通信依赖
  2. 安装IoTDB Python官方包(建议版本≥2.0),提供所有原生操作接口

直接用pip命令安装就行,执行以下两行:

bash 复制代码
pip3 install thrift>=0.13
pip3 install apache-iotdb>=2.0

二、快速入门:基础Session连接与使用

和Java接口类似,Python操作IoTDB的核心也是Session对象,所有数据库操作都基于它展开。先看一个最简的连接示例,几行代码就能完成建连、查时区、断连的全流程:

python 复制代码
from iotdb.Session import Session

# 配置连接信息
ip = "127.0.0.1"
port_ = 6667  # 注意这里可以是int,也可以是str
username_ = "root"
password_ = "root"

# 初始化Session并建连
session = Session(ip, port_, username_, password_)
session.open(False)  # False表示不开启RPC压缩

# 简单操作:获取当前时区
zone = session.get_time_zone()
print(f"IoTDB当前时区:{zone}")

# 关闭连接,释放资源
session.close()

2.1 Session两种初始化方式

实际开发中,分单节点初始化多节点初始化两种场景,多节点模式能实现容灾重试,推荐生产环境使用:

(1)单节点初始化(基础版)

可配置拉取大小、时区、重定向等参数,按需调整:

python 复制代码
session = Session(
    ip="127.0.0.1",
    port=6667,
    user="root",
    password="root",
    fetch_size=1024,  # 查询结果默认批量拉取大小
    zone_id="UTC+8",   # 会话时区
    enable_redirection=True  # 是否启用重定向
)
(2)多节点初始化(容灾版)

传入节点URL列表,当一个节点宕机时,会自动连接其他节点,提升可用性:

python 复制代码
session = Session.init_from_node_urls(
    node_urls=["127.0.0.1:6667", "127.0.0.1:6668", "127.0.0.1:6669"],
    user="root",
    password="root",
    fetch_size=1024,
    zone_id="UTC+8",
    enable_redirection=True
)

2.2 Session核心基础操作

  • 开启连接:session.open(enable_rpc_compression=False)注意RPC压缩开关要和服务端保持一致,否则连接失败
  • 关闭连接:session.close(),使用完必须调用,释放服务端连接资源

三、高效管理:SessionPool连接池使用

单Session在多线程场景下效率低,还容易出现连接复用问题,官方提供了SessionPool连接池来管理Session,自动实现连接复用,无需手动关注连接创建和销毁。

3.1 创建SessionPool

支持单节点和多节点两种配置方式,核心配置连接池最大大小、阻塞超时时间:

python 复制代码
from iotdb.SessionPool import PoolConfig, SessionPool

# 方式1:单节点配置PoolConfig
pool_config = PoolConfig(
    host="127.0.0.1",
    port=6667,
    user_name="root",
    password="root",
    fetch_size=1024,
    time_zone="UTC+8",
    max_retry=3  # 连接失败重试次数
)

# 方式2:多节点配置PoolConfig
# pool_config = PoolConfig(
#     node_urls=["127.0.0.1:6667", "127.0.0.1:6668"],
#     user_name="root",
#     password="root",
#     fetch_size=1024,
#     time_zone="UTC+8",
#     max_retry=3
# )

# 初始化连接池:最大连接数5,获取连接阻塞超时3000毫秒
max_pool_size = 5
wait_timeout_in_ms = 3000
session_pool = SessionPool(pool_config, max_pool_size, wait_timeout_in_ms)

3.2 SessionPool核心操作

使用连接池的核心是获取连接-执行操作-归还连接,三步流程,用完必须归还,否则会造成连接泄漏:

python 复制代码
# 1. 从连接池获取Session
session = session_pool.get_session()

# 2. 执行数据库操作(示例:创建存储组、创建时间序列)
STORAGE_GROUP_NAME = "root.sg1"
TIMESERIES_PATH = "root.sg1.d1.s1"
from iotdb.utils.DataType import TSDataType
from iotdb.utils.Encoding import TSEncoding
from iotdb.utils.Compressor import Compressor

session.set_storage_group(STORAGE_GROUP_NAME)
session.create_time_series(
    TIMESERIES_PATH, 
    TSDataType.BOOLEAN, 
    TSEncoding.PLAIN, 
    Compressor.SNAPPY
)

# 3. 使用完归还Session到连接池
session_pool.put_back(session)

# 4. 关闭连接池(程序结束时执行),自动关闭所有管理的Session
session_pool.close()

四、安全通信:SSL加密连接配置

生产环境中,为了保证数据传输安全,需要开启SSL加密连接,分为服务端证书配置Python客户端配置两步,缺一不可。

4.1 服务端配置

在IoTDB的conf/iotdb-system.properties配置文件中,添加/修改以下配置,指定证书路径和密码:

properties 复制代码
enable_thrift_ssl=true
key_store_path=/path/to/your/server_keystore.jks
key_store_pwd=your_keystore_password

4.2 Python客户端配置

初始化Session/SessionPool时,设置use_ssl=True,并指定服务端证书路径(crt/pem格式均可),提供两个实战示例:

示例1:SSL连接+单Session
python 复制代码
from iotdb.Session import Session

ip = "127.0.0.1"
port_ = 6667
username_ = "root"
password_ = "root"
# 开启SSL并指定证书路径
use_ssl = True
ca_certs = "/path/to/your/server.crt"  # 或ca_certs = "/path/to/ca_cert.pem"

def get_data():
    session = Session(
        ip, port_, username_, password_, 
        use_ssl=use_ssl, ca_certs=ca_certs
    )
    session.open(False)
    # 执行查询并转换为Pandas DataFrame
    result = session.execute_query_statement("select * from root.eg.etth")
    df = result.todf()
    df.rename(columns={"Time": "date"}, inplace=True)
    session.close()
    return df

if __name__ == "__main__":
    df = get_data()
    print(df)
示例2:SSL连接+SessionPool
python 复制代码
from iotdb.SessionPool import PoolConfig, SessionPool

ip = "127.0.0.1"
port_ = 6667
username_ = "root"
password_ = "root"
use_ssl = True
ca_certs = "/path/to/your/server.crt"

def get_data2():
    # 配置带SSL的PoolConfig
    pool_config = PoolConfig(
        host=ip,
        port=port_,
        user_name=username_,
        password=password_,
        fetch_size=1024,
        time_zone="UTC+8",
        max_retry=3,
        use_ssl=use_ssl,
        ca_certs=ca_certs,
    )
    session_pool = SessionPool(pool_config, 5, 3000)
    # 获取并使用Session
    session = session_pool.get_session()
    result = session.execute_query_statement("select * from root.eg.etth")
    df = result.todf()
    df.rename(columns={"Time": "date"}, inplace=True)
    # 归还并关闭
    session_pool.put_back(session)
    session_pool.close()
    return df

if __name__ == "__main__":
    df = get_data2()
    print(df)

五、核心操作:DDL数据定义接口

DDL操作主要是对存储组(Database)时间序列的管理,包括创建、删除、检测存在性等,是操作IoTDB的基础,所有接口都通过Session对象调用。

5.1 存储组管理

存储组是IoTDB的一级数据组织单位,先创建存储组才能创建时间序列:

python 复制代码
# 设置/创建存储组
session.set_storage_group("root.sg1")

# 删除单个存储组
session.delete_storage_group("root.sg1")

# 批量删除存储组
session.delete_storage_groups(["root.sg1", "root.sg2"])

5.2 时间序列管理

支持单/批量创建普通时间序列、对齐时间序列,以及删除、检测存在性,注意对齐时间序列目前暂不支持传感器别名

python 复制代码
from iotdb.utils.DataType import TSDataType
from iotdb.utils.Encoding import TSEncoding
from iotdb.utils.Compressor import Compressor

# 1. 创建单个普通时间序列
session.create_time_series(
    ts_path="root.sg1.d1.s1",
    data_type=TSDataType.INT64,
    encoding=TSEncoding.RLE,
    compressor=Compressor.SNAPPY,
    props=None,  # 扩展属性
    tags={"device": "d1"},  # 标签
    attributes={"unit": "℃"},  # 属性
    alias=None  # 别名
)

# 2. 批量创建普通时间序列
session.create_multi_time_series(
    ts_path_lst=["root.sg1.d1.s1", "root.sg1.d1.s2"],
    data_type_lst=[TSDataType.INT64, TSDataType.FLOAT],
    encoding_lst=[TSEncoding.RLE, TSEncoding.PLAIN],
    compressor_lst=[Compressor.SNAPPY, Compressor.LZ4]
)

# 3. 创建对齐时间序列
session.create_aligned_time_series(
    device_id="root.sg1.d1",
    measurements_lst=["s1", "s2", "s3"],
    data_type_lst=[TSDataType.INT64, TSDataType.FLOAT, TSDataType.BOOLEAN],
    encoding_lst=[TSEncoding.RLE, TSEncoding.PLAIN, TSEncoding.RLE],
    compressor_lst=[Compressor.SNAPPY, Compressor.LZ4, Compressor.SNAPPY]
)

# 4. 批量删除时间序列
session.delete_time_series(["root.sg1.d1.s1", "root.sg1.d1.s2"])

# 5. 检测时间序列是否存在
is_exist = session.check_time_series_exists("root.sg1.d1.s1")
print(f"时间序列是否存在:{is_exist}")

六、核心操作:DML数据操作接口

DML操作是IoTDB的核心,主要是数据写入 ,官方推荐使用insert_tablet方式写入,效率远高于单条插入,还支持空值写入。Python接口提供了普通TabletNumpy Tablet两种实现,Numpy Tablet针对数值型数据做了优化,内存占用更低、写入速度更快。

6.1 推荐方式:Tablet写入

(1)普通Tablet写入(支持所有数据类型,兼容空值)

Tablet是一个设备的若干行数据块,每一行的测点列都相同,适合批量写入单设备多时间戳数据:

python 复制代码
from iotdb.utils.Tablet import Tablet
from iotdb.utils.DataType import TSDataType

# 配置设备、测点、数据类型
device_id = "root.sg1.d1"
measurements_ = ["s1", "s2", "s3", "s4", "s5", "s6"]
data_types_ = [TSDataType.BOOLEAN, TSDataType.INT32, TSDataType.INT64, TSDataType.FLOAT, TSDataType.DOUBLE, TSDataType.TEXT]

# 示例1:写入非空数据
values_ = [
    [False, 10, 11, 1.1, 10011.1, "test01"],
    [True, 100, 11111, 1.25, 101.0, "test02"],
    [False, 100, 1, 188.1, 688.25, "test03"],
    [True, 0, 0, 0, 6.25, "test04"],
]
timestamps_ = [1, 2, 3, 4]
tablet_ = Tablet(device_id, measurements_, data_types_, values_, timestamps_)
session.insert_tablet(tablet_)

# 示例2:写入含空值数据(None表示空值)
values_ = [
    [None, 10, 11, 1.1, 10011.1, "test01"],
    [True, None, 11111, 1.25, 101.0, "test02"],
    [False, 100, None, 188.1, 688.25, "test03"],
    [True, 0, 0, 0, None, None],
]
timestamps_ = [16, 17, 18, 19]
tablet_ = Tablet(device_id, measurements_, data_types_, values_, timestamps_)
session.insert_tablet(tablet_)
(2)Numpy Tablet写入(数值型数据优选,效率更高)

使用numpy.ndarray存储数据,大幅降低内存占用和序列化耗时,推荐数值型数据使用,支持大端类型(建议显式指定,客户端也会自动做大小端转换):

python 复制代码
import numpy as np
from iotdb.utils.NumpyTablet import NumpyTablet
from iotdb.utils.BitMap import BitMap
from iotdb.utils.DataType import TSDataType

device_id = "root.sg1.d1"
measurements_ = ["s1", "s2", "s3", "s4", "s5", "s6"]
data_types_ = [TSDataType.BOOLEAN, TSDataType.INT32, TSDataType.INT64, TSDataType.FLOAT, TSDataType.DOUBLE, TSDataType.TEXT]

# 1. 写入非空Numpy Tablet
np_values_ = [
    np.array([False, True, False, True], TSDataType.BOOLEAN.np_dtype()),
    np.array([10, 100, 100, 0], TSDataType.INT32.np_dtype()),
    np.array([11, 11111, 1, 0], TSDataType.INT64.np_dtype()),
    np.array([1.1, 1.25, 188.1, 0], TSDataType.FLOAT.np_dtype()),
    np.array([10011.1, 101.0, 688.25, 6.25], TSDataType.DOUBLE.np_dtype()),
    np.array(["test01", "test02", "test03", "test04"], TSDataType.TEXT.np_dtype()),
]
np_timestamps_ = np.array([1, 2, 3, 4], TSDataType.INT64.np_dtype())
np_tablet_ = NumpyTablet(device_id, measurements_, data_types_, np_values_, np_timestamps_)
session.insert_tablet(np_tablet_)

# 2. 写入含空值的Numpy Tablet(用BitMap标记空值位置)
np_values_ = [
    np.array([False, True, False, True], TSDataType.BOOLEAN.np_dtype()),
    np.array([10, 100, 100, 0], TSDataType.INT32.np_dtype()),
    np.array([11, 11111, 1, 0], TSDataType.INT64.np_dtype()),
    np.array([1.1, 1.25, 188.1, 0], TSDataType.FLOAT.np_dtype()),
    np.array([10011.1, 101.0, 688.25, 6.25], TSDataType.DOUBLE.np_dtype()),
    np.array(["test01", "test02", "test03", "test04"], TSDataType.TEXT.np_dtype()),
]
np_timestamps_ = np.array([98, 99, 100, 101], TSDataType.INT64.np_dtype())
# 初始化BitMap,标记每个测点的空值位置
np_bitmaps_ = []
for i in range(len(measurements_)):
    np_bitmaps_.append(BitMap(len(np_timestamps_)))
np_bitmaps_[0].mark(0)  # s1的第0行是空值
np_bitmaps_[1].mark(1)  # s2的第1行是空值
np_bitmaps_[2].mark(2)  # s3的第2行是空值
np_bitmaps_[4].mark(3)  # s5的第3行是空值
np_bitmaps_[5].mark(3)  # s6的第3行是空值
# 插入含空值的Numpy Tablet
np_tablet_with_none = NumpyTablet(device_id, measurements_, data_types_, np_values_, np_timestamps_, np_bitmaps_)
session.insert_tablet(np_tablet_with_none)
(3)批量插入多个Tablet

适合同时写入多个设备的Tablet数据,一次调用完成批量操作:

python 复制代码
# 构建多个Tablet对象,加入列表
tablet_lst = [tablet1, tablet2, np_tablet1]
# 批量插入
session.insert_tablets(tablet_lst)

6.2 基础方式:Record写入

Record是一个设备一个时间戳下的多个测点数据,适合单条/少量数据写入,效率低于Tablet,了解即可:

python 复制代码
# 1. 插入单个Record
session.insert_record(
    device_id="root.sg1.d1",
    timestamp=100,
    measurements_=["s1", "s2"],
    data_types_=[TSDataType.INT64, TSDataType.FLOAT],
    values_=[100, 25.5]
)

# 2. 批量插入多个Record(多设备)
session.insert_records(
    device_ids_=["root.sg1.d1", "root.sg1.d2"],
    time_list_=[101, 102],
    measurements_list_=[["s1", "s2"], ["s1", "s2"]],
    data_type_list_=[[TSDataType.INT64, TSDataType.FLOAT], [TSDataType.INT64, TSDataType.FLOAT]],
    values_list_=[[200, 30.0], [300, 40.5]]
)

# 3. 插入单设备的多个Record
session.insert_records_of_one_device(
    device_id="root.sg1.d1",
    time_list=[103, 104],
    measurements_list=[["s1", "s2"], ["s1", "s2"]],
    data_types_list=[[TSDataType.INT64, TSDataType.FLOAT], [TSDataType.INT64, TSDataType.FLOAT]],
    values_list=[[400, 50.0], [500, 60.5]]
)

6.3 特殊方式:带类型推断的写入

如果数据都是字符串类型,可以使用insert_str_record接口,服务端会自动根据字符串值推断数据类型(如"true"→BOOLEAN,"3.2"→FLOAT),注意:类型推断会有额外耗时,效率低于普通写入

python 复制代码
# 字符串值自动推断类型
session.insert_str_record(
    device_id="root.sg1.d1",
    timestamp=200,
    measurements=["s1", "s2", "s3"],
    string_values=["true", "100", "3.14"]
)

6.4 对齐时间序列写入

对齐时间序列的写入接口都是insert_aligned_xxx格式,用法和普通时间序列一致,仅接口名不同,举例:

python 复制代码
# 插入对齐Tablet
session.insert_aligned_tablet(aligned_tablet)
# 插入单个对齐Record
session.insert_aligned_record(device_id, timestamp, measurements_, data_types_, values_)

七、灵活查询:IoTDB-SQL接口

Python原生接口支持直接执行IoTDB-SQL语句,分为查询语句非查询语句,查询结果可直接转换为Pandas DataFrame,适配数据分析场景。

python 复制代码
# 1. 执行查询语句(返回结果集)
result = session.execute_query_statement("SELECT ** FROM root.sg1.d1 LIMIT 10")
# 转换为Pandas DataFrame(数据分析优选)
df = result.todf()
print(df)

# 2. 执行非查询语句(DDL/DML,无返回结果)
session.execute_non_query_statement("SET STORAGE GROUP TO root.sg2")
session.execute_non_query_statement("CREATE TIMESERIES root.sg2.d1.s1 WITH DATATYPE=INT64, ENCODING=RLE")

# 3. 通用执行语句(自动适配查询/非查询)
session.execute_statement("DELETE TIMESERIES root.sg2.d1.s1")

八、高级特性:元数据模板接口

IoTDB的元数据模板可以快速批量创建相同结构的时间序列,避免重复配置,Python接口支持模板的创建、修改、挂载、卸载、查询、删除全流程操作。

8.1 构建并创建元数据模板

先创建Template对象,添加测点节点(MeasurementNode),再调用创建接口:

python 复制代码
from iotdb.utils.Template import Template, MeasurementNode
from iotdb.utils.DataType import TSDataType
from iotdb.utils.Encoding import TSEncoding
from iotdb.utils.Compressor import Compressor

# 1. 构建模板(share_time=True表示共享时间戳,即对齐时间序列)
template_name = "device_template"
template = Template(name=template_name, share_time=True)

# 2. 添加测点节点
m_node_s1 = MeasurementNode("s1", TSDataType.INT64, TSEncoding.RLE, Compressor.SNAPPY)
m_node_s2 = MeasurementNode("s2", TSDataType.FLOAT, TSEncoding.PLAIN, Compressor.LZ4)
m_node_s3 = MeasurementNode("s3", TSDataType.BOOLEAN, TSEncoding.RLE, Compressor.SNAPPY)
template.add_template(m_node_s1)
template.add_template(m_node_s2)
template.add_template(m_node_s3)

# 3. 创建元数据模板
session.create_schema_template(template)

8.2 模板修改、挂载与卸载

python 复制代码
# 1. 给模板添加测点
session.add_measurements_in_template(
    template_name="device_template",
    measurements_path=["s4"],
    data_types=[TSDataType.DOUBLE],
    encodings=[TSEncoding.PLAIN],
    compressors=[Compressor.LZ4],
    is_aligned=True  # 是否为对齐测点
)

# 2. 从模板删除测点
session.delete_node_in_template(template_name="device_template", path="s4")

# 3. 挂载模板到指定路径(路径下的设备将使用该模板)
session.set_schema_template(template_name="device_template", prefix_path="root.sg1")

# 4. 从指定路径卸载模板
session.unset_schema_template(template_name="device_template", prefix_path="root.sg1")

8.3 模板查询与删除

python 复制代码
# 1. 查看所有模板
all_templates = session.show_all_templates()
print(all_templates)

# 2. 查看模板中的测点数量
count = session.count_measurements_in_template("device_template")
print(f"模板测点数量:{count}")

# 3. 查看模板下的所有测点
measurements = session.show_measurements_in_template("device_template")
print(measurements)

# 4. 删除模板(**注意:已挂载的模板无法删除**)
session.drop_schema_template("device_template")

九、数据分析友好:Pandas完美支持

IoTDB Python接口对Pandas做了深度适配,查询结果集SessionDataSet提供了todf()方法,可一键将查询结果转换为Pandas DataFrame,直接进行数据分析、可视化,这也是Python对接IoTDB的一大优势:

python 复制代码
from iotdb.Session import Session
import pandas as pd

session = Session("127.0.0.1", 6667, "root", "root")
session.open(False)

# 执行查询
result = session.execute_query_statement("SELECT ** FROM root.sg1.d1")
# 一键转换为DataFrame
df = result.todf()

# 后续可直接进行Pandas操作
print(df.head())  # 查看前5行
print(df.describe())  # 统计分析
df.plot(x="Time", y="s1")  # 绘图

session.close()

十、测试便捷:IoTDB Testcontainer

Python客户端基于testcontainers库提供了容器化测试支持,无需手动部署IoTDB,可在Docker容器中快速启动/停止IoTDB实例,适合单元测试和集成测试。

10.1 安装依赖

bash 复制代码
pip3 install testcontainers

10.2 实战示例

通过IoTDBContainer快速启动IoTDB,支持指定版本:

python 复制代码
import unittest
from iotdb.Session import Session
from testcontainers.iotdb import IoTDBContainer

class MyTestCase(unittest.TestCase):
    def test_something(self):
        # 启动IoTDB容器(默认最新版,指定版本:IoTDBContainer("apache/iotdb:0.12.0"))
        with IoTDBContainer() as c:
            # 连接容器中的IoTDB
            session = Session("localhost", c.get_exposed_port(6667), "root", "root")
            session.open(False)
            # 执行测试操作
            result = session.execute_query_statement("SHOW TIMESERIES")
            print(result)
            session.close()

if __name__ == '__main__':
    unittest.main()

十一、通用适配:IoTDB DBAPI(遵循Python DB API 2.0)

IoTDB提供了遵循Python DB API 2.0规范的通用接口,适配Python生态的通用数据库操作方式,支持普通SQL执行、带参数SQL、批量执行SQL,适合习惯通用DBAPI的开发者。

11.1 基础使用示例

python 复制代码
from iotdb.dbapi import connect

# 1. 建立连接(参数与Session一致)
ip = "127.0.0.1"
port_ = 6667
username_ = "root"
password_ = "root"
conn = connect(
    ip, port_, username_, password_,
    fetch_size=1024,
    zone_id="UTC+8",
    sqlalchemy_mode=False
)
cursor = conn.cursor()

# 2. 执行简单SQL查询
cursor.execute("SELECT ** FROM root.sg1.d1 LIMIT 5")
# 获取所有结果
for row in cursor.fetchall():
    print(row)

# 3. 执行带参数的SQL(pyformat风格)
cursor.execute("SELECT ** FROM root.sg1.d1 WHERE time < %(time)s", {"time":"2024-01-01T00:08:00.000"})
for row in cursor.fetchall():
    print(row)

# 4. 批量执行带参数的SQL(插入数据)
seq_of_parameters = [
    {"timestamp": 1, "temperature": 25.5},
    {"timestamp": 2, "temperature": 26.0},
    {"timestamp": 3, "temperature": 26.5},
]
sql = "insert into root.sg1.d1(timestamp,temperature) values(%(timestamp)s,%(temperature)s)"
cursor.executemany(sql, seq_of_parameters)

# 5. 关闭游标和连接
cursor.close()
conn.close()

十二、拓展适配:IoTDB SQLAlchemy Dialect(实验性)

IoTDB提供了SQLAlchemy方言适配,主要为了对接Apache Superset等可视化工具,注意:该特性仍为实验性,请勿在生产环境使用,仅支持简单的查询和ORM映射。

12.1 数据模型映射

IoTDB的层次数据模型与SQLAlchemy的关系数据模型做了如下映射,是适配的基础:

SQLAlchemy元数据 IoTDB元数据
Schema Database(存储组)
Table Path + Entity(设备)
Column Measurement(测点)

12.2 数据类型映射

IoTDB数据类型 SQLAlchemy数据类型
BOOLEAN Boolean
INT32 Integer
INT64 BigInteger
FLOAT Float
DOUBLE Float
TEXT Text
LONG BigInteger

12.3 基础使用示例

(1)直接执行SQL
python 复制代码
from sqlalchemy import create_engine

# 创建引擎(连接格式:iotdb://用户名:密码@ip:端口)
engine = create_engine("iotdb://root:root@127.0.0.1:6667")
connect = engine.connect()

# 执行查询
result = connect.execute("SELECT ** FROM root.sg1.d1 LIMIT 5")
for row in result.fetchall():
    print(row)

connect.close()
(2)简单ORM查询

仅支持基础的查询和过滤,复杂操作暂不支持:

python 复制代码
from sqlalchemy import create_engine, Column, Float, BigInteger, MetaData
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

# 配置元数据(指定存储组)
metadata = MetaData(schema='root.sg1')
Base = declarative_base(metadata=metadata)

# 定义ORM模型(映射设备root.sg1.d1)
class Device(Base):
    __tablename__ = "d1"
    Time = Column(BigInteger, primary_key=True)  # 时间戳为主键
    s1 = Column(BigInteger)  # 测点s1
    s2 = Column(Float)       # 测点s2

# 创建引擎并建立会话
engine = create_engine("iotdb://root:root@127.0.0.1:6667")
DbSession = sessionmaker(bind=engine)
session = DbSession()

# 执行ORM查询(过滤s2>20的数据,查询s1)
res = session.query(Device.s1).filter(Device.s2 > 20)
for row in res:
    print(row)

session.close()

十三、开发与发版:给Python开发者的说明

如果需要对IoTDB Python客户端进行二次开发、调试或发版,需遵循以下步骤,核心基于Thrift编译和Maven构建:

13.1 开发环境准备

  1. 首选Python3.7+版本
  2. 安装thrift可执行文件(≥0.11.0),参考官方安装教程
  3. 安装开发依赖:pip install -r requirements_dev.txt

13.2 编译Thrift库

在IoTDB源代码根目录执行以下Maven命令,自动生成Python的Thrift通信代码:

bash 复制代码
mvn clean generate-sources -pl iotdb-client/client-py -am

注意 :生成的代码在iotdb/thrift目录,该目录会被Git忽略,切勿上传到代码仓库。

13.3 测试与格式化

  1. 自定义测试用例添加到tests文件夹
  2. 运行所有测试:pytest .(部分测试需要Docker环境)
  3. 代码格式化:black .
  4. 代码检查:flake8 .

13.4 发版流程

官方提供了release.sh脚本,一键完成发版全流程:删除临时目录→重新生成源码→代码检查→运行测试→构建包→发布到PyPI。

十四、总结

IoTDB Python原生接口是Python开发者对接IoTDB的最佳选择,封装友好、功能全面,从基础的Session连接DDL/DML操作 ,到高级的SessionPool连接池SSL加密元数据模板 ,再到数据分析友好的Pandas适配 、测试便捷的Testcontainer 、通用的DBAPI,几乎覆盖了所有开发场景。

核心使用要点总结:

  1. 生产环境优先使用多节点Session/SessionPool,实现容灾重试
  2. 数据写入首选Tablet方式,Numpy Tablet对数值型数据效率更高
  3. 数据分析直接使用todf()方法转换为Pandas DataFrame,高效便捷
  4. 安全通信开启SSL加密,服务端和客户端证书配置缺一不可
  5. 批量创建相同结构时间序列使用元数据模板,减少重复工作
  6. 测试使用Testcontainer,容器化快速启动IoTDB,无需手动部署

不管是工业物联网的实时数据采集、时序数据存储,还是后续的数据分析、可视化,IoTDB Python原生接口都能完美适配,结合Python的生态优势,能大幅提升开发效率。

🌐 附:IoTDB的各大版本

📄 Apache IoTDB 是一款工业物联网时序数据库管理系统,采用端边云协同的轻量化架构,支持一体化的物联网时序数据收集、存储、管理与分析 ,具有多协议兼容、超高压缩比、高通量读写、工业级稳定、极简运维等特点。

版本 IoTDB 二进制包 IoTDB 源代码 发布说明
2.0.5 - All-in-one - AINode - SHA512 - ASC - 源代码 - SHA512 - ASC release notes
1.3.5 - All-in-one - AINode - SHA512 - ASC - 源代码 - SHA512 - ASC release notes
0.13.4 - All-in-one - Grafana 连接器 - Grafana 插件 - SHA512 - ASC - 源代码 - SHA512 - ASC release notes

✨ 目前最新版本为2.0.6,去获取:https://archive.apache.org/dist/iotdb/

联系博主

xcLeigh 博主,全栈领域优质创作者,博客专家,目前,活跃在CSDN、微信公众号、小红书、知乎、掘金、快手、思否、微博、51CTO、B站、腾讯云开发者社区、阿里云开发者社区等平台,全网拥有几十万的粉丝,全网统一IP为 xcLeigh。希望通过我的分享,让大家能在喜悦的情况下收获到有用的知识。主要分享编程、开发工具、算法、技术学习心得等内容。很多读者评价他的文章简洁易懂,尤其对于一些复杂的技术话题,他能通过通俗的语言来解释,帮助初学者更好地理解。博客通常也会涉及一些实践经验,项目分享以及解决实际开发中遇到的问题。如果你是开发领域的初学者,或者在学习一些新的编程语言或框架,关注他的文章对你有很大帮助。

亲爱的朋友,无论前路如何漫长与崎岖,都请怀揣梦想的火种,因为在生活的广袤星空中,总有一颗属于你的璀璨星辰在熠熠生辉,静候你抵达。

愿你在这纷繁世间,能时常收获微小而确定的幸福,如春日微风轻拂面庞,所有的疲惫与烦恼都能被温柔以待,内心永远充盈着安宁与慰藉。

至此,文章已至尾声,而您的故事仍在续写,不知您对文中所叙有何独特见解?期待您在心中与我对话,开启思想的新交流。


💞 关注博主 🌀 带你实现畅游前后端!

🏰 大屏可视化 🌀 带你体验酷炫大屏!

💯 神秘个人简介 🌀 带你体验不一样得介绍!

🥇 从零到一学习Python 🌀 带你玩转Python技术流!

🏆 前沿应用深度测评 🌀 前沿AI产品热门应用在线等你来发掘!

💦 :本文撰写于CSDN平台 ,作者:xcLeigh所有权归作者所有)https://xcleigh.blog.csdn.net/,如果相关下载没有跳转,请查看这个地址,相关链接没有跳转,皆是抄袭本文,转载请备注本文原地址。


📣 亲,码字不易,动动小手,欢迎 点赞 ➕ 收藏,如 🈶 问题请留言(或者关注下方公众号,看见后第一时间回复,还有海量编程资料等你来领!),博主看见后一定及时给您答复 💌💌💌

相关推荐
User_芊芊君子2 小时前
文科生封神!Python+AI 零门槛变现:3 天造 App,指令即收入(附脉脉 AI 沙龙干货)
开发语言·人工智能·python
MeowNeko2 小时前
为什么说程序员重命名时电脑不要带中文?记一次python manage.py runserver时UnicodeDecodeError的原因与解决方案
人工智能·python·chatgpt·中间件·django·utf8
是Dream呀2 小时前
2025年中秋月亮只有94.91%圆?Python告诉你真相
开发语言·python·中秋节
星辰徐哥2 小时前
Python开发从入门到精通:异步编程与协程
开发语言·python
AI智能研究院2 小时前
Python系列进阶教程(一)Python 面向对象
开发语言·python
郁大锤2 小时前
Windows 环境下安装 Python 与环境变量配置
开发语言·windows·python
李德没德2 小时前
零基础快速入门Python:从安装到写出第一个程序
开发语言·python·新人首发
xcLeigh2 小时前
Python操作国产金仓数据库(KingbaseES)全流程:从环境搭建到实战应用
开发语言·数据库·python·国产数据库·kingbasees·金仓数据库
人道领域3 小时前
Day | 11 【苍穹外卖统计业务的实现:含详细思路分析】
java·数据库·后端·苍穹外卖