在现代物联网(IoT)应用中,时序数据的管理变得愈发重要。本文将详细介绍一段使用 Python 编写的时序数据库代码,解析其设计思想与实现方式。该代码使用了 sqlmodel 和 sqlalchemy 库,构建了一个简单而高效的时序数据库,用于存储设备信息、数据点及其对应的时序数据。
一、基础模型定义
代码首先定义了三个基本模型:Device、Point 和 TimeSeries。这些模型通过 SQLAlchemy 的 ORM 功能来实现数据库表的映射,使得数据的管理更加灵活和高效。
1. Device 类
Device 类代表一个设备,包含以下字段:
- id: 设备的唯一标识符,主键。
- name: 设备名称,索引字段。
- address: 设备地址,用于网络连接。
- property: 设备连接信息,以 JSON 格式存储,便于扩展。
- device_type: 设备类型,索引字段。
- description: 设备描述,非必填。
- created_at: 记录创建时间,默认使用 UTC 时间。
该类还与 Point 类建立了一对多的关系,表示一个设备可以有多个数据点。
2. Point 类
Point 类表示设备的某个监测点,包含:
- id: 主键。
- name: 点位名称,索引字段。
- unit: 数据单位,例如摄氏度(°C)。
- property: 点位的扩展属性,使用 JSON 格式。
- description: 点位的描述,非必填。
- device_id: 外键,关联到 Device 表。
Point 类与 TimeSeries 类也建立了一对多的关系,指明一个点位可以有多条时序数据。
3. TimeSeries 类
TimeSeries 类用于存储具体的时序数据,包括:
- id: 主键。
- value: 数据值,例如温度读数。
- timestamp: 数据记录的时间戳,默认使用 UTC 时间。
- point_id: 外键,关联到 Point 表。
二、数据库连接与表创建
数据库连接使用 SQLite,代码中通过 create_engine 方法创建数据库连接,并定义了一个 create_db_and_tables 函数用于初始化数据库及表结构。
DATABASE_URL = "sqlite:///iot.db"
这里的 echo=True 参数在调试阶段非常有用,它会在控制台输出执行的 SQL 语句,便于开发者观察数据库操作的具体情况。
三、示例操作
下面介绍如何使用定义的模型进行数据库操作,包括创建设备、点位和时序数据。
1. 创建示例设备
首先创建一个设备实例 device_1,并为其添加连接信息和描述。
device_1 = Device(
2. 创建设备点位
接着,创建了一个数据点 point_1,并将其与设备关联。
point_1 = Point(
3. 添加时序数据
然后,添加一些时序数据到 TimeSeries 表中,记录不同时间点的温度读数。
4. 查询示例
最后,展示如何查询设备及其点位和历史数据。通过 session.get() 方法可以轻松获取设备和点位的信息,并遍历其时序数据。
device = session.get(Device, 1)
四、注意事项
在使用该时序数据库时,有几项注意事项:
- 数据库文件将保存在当前目录下,以 iot.db 命名。
- JSON 字段可以直接使用 Python 字典进行操作,支持灵活的数据结构。
- 时间字段默认使用 UTC 时间,可以根据需求进行调整
- 关系查询采用延迟加载策略,优化性能
五、总结
本文展示了如何使用 SQLModel 和 SQLAlchemy 构建一个简单的时序数据库。通过清晰的模型设计和灵活的关系定义,可以有效地管理和查询设备及其时序数据,为物联网轻量级应用提供了强大的数据支持。这种设计不仅满足了当前的需求,还具有良好的扩展性,适应未来更多复杂的数据管理需求。
最后附上完整代码,感兴趣的可以自己运行试试。
mydb.zip
(1.57 KB, 下载次数: 0)
暂无评论,快来抢沙发吧