在现代物联网(IoT)应用中,时序数据的管理变得愈发重要。本文将详细介绍一段使用 Python 编写的时序数据库代码,解析其设计思想与实现方式。该代码使用了 sqlmodel 和 sqlalchemy 库,构建了一个简单而高效的时序数据库,用于存储设备信息、数据点及其对应的时序数据。

一、基础模型定义

代码首先定义了三个基本模型:DevicePointTimeSeries。这些模型通过 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"
  • engine = create_engine(DATABASE_URL, echo=True)

  • def create_db_and_tables():
  •     SQLModel.metadata.create_all(engine)
  • 复制代码

    这里的 echo=True 参数在调试阶段非常有用,它会在控制台输出执行的 SQL 语句,便于开发者观察数据库操作的具体情况。

    三、示例操作

    下面介绍如何使用定义的模型进行数据库操作,包括创建设备、点位和时序数据。

    1. 创建示例设备

    首先创建一个设备实例 device_1,并为其添加连接信息和描述。

    device_1 = Device(
  •     name="温度传感器01",
  •     address="192.168.1.100",
  •     property={"protocol": "MODBUS", "port": 502},
  •     device_type="温度传感器",
  •     description="车间温度监测设备"
  • )
  • 复制代码

    2. 创建设备点位

    接着,创建了一个数据点 point_1,并将其与设备关联。

    point_1 = Point(
  •     name="temperature",
  •     unit="°C",
  •     property={"register_address": 40001, "data_type": "float"},
  •     description="环境温度监测点",
  •     device=device_1
  • )
  • 复制代码

    3. 添加时序数据

    然后,添加一些时序数据到 TimeSeries 表中,记录不同时间点的温度读数。

    <pre>ts_data = [
  •     TimeSeries(point=point_1, value=25.3),
  •     TimeSeries(point=point_1, value=25.5, timestamp=datetime(2024, 5, 1, 10, 0, 0)),
  •     TimeSeries(point=point_1, value=25.8, timestamp=datetime(2024, 5, 1, 10, 5, 0))
  • ]</pre>
  • 复制代码

    4. 查询示例

    最后,展示如何查询设备及其点位和历史数据。通过 session.get() 方法可以轻松获取设备和点位的信息,并遍历其时序数据。

    device = session.get(Device, 1)
  • point = session.get(Point, 1)
  • for ts in point.timeseries:
  •     print(f"{ts.timestamp} | {ts.value}{point.unit}")
  • 复制代码

    四、注意事项

    在使用该时序数据库时,有几项注意事项:

    • 数据库文件将保存在当前目录下,以 iot.db 命名。
    • JSON 字段可以直接使用 Python 字典进行操作,支持灵活的数据结构。
    • 时间字段默认使用 UTC 时间,可以根据需求进行调整
    • 关系查询采用延迟加载策略,优化性能

    五、总结
    本文展示了如何使用 SQLModel 和 SQLAlchemy 构建一个简单的时序数据库。通过清晰的模型设计和灵活的关系定义,可以有效地管理和查询设备及其时序数据,为物联网轻量级应用提供了强大的数据支持。这种设计不仅满足了当前的需求,还具有良好的扩展性,适应未来更多复杂的数据管理需求。
    最后附上完整代码,感兴趣的可以自己运行试试。 mydb.zip (1.57 KB, 下载次数: 0)

    全部回复 0
    暂无评论,快来抢沙发吧