

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

做IoTDB时序数据开发的小伙伴,用Python对接肯定是高频需求,IoTDB官方的Python原生接口封装得特别友好,不管是基础的数据库连接、数据读写,还是高级的连接池管理、SSL加密、Pandas适配,全都能实现。今天就从环境搭建、基础使用,到DDL/DML操作、高级特性,再到测试和DBAPI适配,把IoTDB Python原生接口的用法一次性讲透,新手也能直接上手开发。
一、前期准备:安装依赖与包
用IoTDB Python原生接口前,得先装好两个核心依赖,一步到位不踩坑:
- 安装thrift框架(要求版本≥0.13),是IoTDB底层的通信依赖
- 安装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接口提供了普通Tablet 和Numpy 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 开发环境准备
- 首选Python3.7+版本
- 安装thrift可执行文件(≥0.11.0),参考官方安装教程
- 安装开发依赖:
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 测试与格式化
- 自定义测试用例添加到
tests文件夹 - 运行所有测试:
pytest .(部分测试需要Docker环境) - 代码格式化:
black . - 代码检查:
flake8 .
13.4 发版流程
官方提供了release.sh脚本,一键完成发版全流程:删除临时目录→重新生成源码→代码检查→运行测试→构建包→发布到PyPI。
十四、总结
IoTDB Python原生接口是Python开发者对接IoTDB的最佳选择,封装友好、功能全面,从基础的Session连接 、DDL/DML操作 ,到高级的SessionPool连接池 、SSL加密 、元数据模板 ,再到数据分析友好的Pandas适配 、测试便捷的Testcontainer 、通用的DBAPI,几乎覆盖了所有开发场景。
核心使用要点总结:
- 生产环境优先使用多节点Session/SessionPool,实现容灾重试
- 数据写入首选Tablet方式,Numpy Tablet对数值型数据效率更高
- 数据分析直接使用
todf()方法转换为Pandas DataFrame,高效便捷 - 安全通信开启SSL加密,服务端和客户端证书配置缺一不可
- 批量创建相同结构时间序列使用元数据模板,减少重复工作
- 测试使用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/,如果相关下载没有跳转,请查看这个地址,相关链接没有跳转,皆是抄袭本文,转载请备注本文原地址。

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