센서 로그 저장과 조회 · 학습

실행 조건

Python의 sqlite3를 사용하며 DB 서버·계정은 필요하지 않습니다.

이번에 배울 내용

같은 Key로 다시 저장할 때 새 기록이 생기는지 기존 기록이 바뀌는지, 장치 로그의 구조로 확인합니다.

전체 흐름

장치·측정 시각 → Key·중복 처리 → SQLite 저장 → 구간 조회

기록을 구분하는 Key

센서 값의 Key를 (device,t)로 정하면 같은 시각의 재수신을 새 측정과 구분할 수 있습니다. 중복을 무시할지 갱신할지 먼저 정하고 DB 제약으로 고정합니다.

저장소보다 먼저 정할 조회

SQL의 WHERE는 대상·구간을, ORDER BY는 반환 순서를 정합니다. Parameter로 값을 전달하면 입력을 SQL 구문과 섞지 않을 수 있습니다.

SQLite로 확인한 Key·조회·응답 규칙은 다른 저장소로 옮겨도 유지할 수 있습니다.

풀이 예제

장치 m1의 t∈{0,1,1,2}t\in\{0,1,1,2\} s 측정값은 20,21,22,23입니다. 같은 장치·시각은 최신 값으로 갱신합니다.

import sqlite3
connection=sqlite3.connect(':memory:')
connection.execute('CREATE TABLE readings(device TEXT,t REAL,value REAL,PRIMARY KEY(device,t))')
records=[('m1',0,20.),('m1',1,21.),('m1',1,22.),('m1',2,23.)]
connection.executemany('INSERT INTO readings VALUES(?,?,?) ON CONFLICT(device,t) DO UPDATE SET value=excluded.value',records)
connection.commit()
print(connection.execute('SELECT * FROM readings ORDER BY t').fetchall())
import matplotlib.pyplot as plt
points=connection.execute("SELECT t,value FROM readings ORDER BY t").fetchall()
plt.plot(*zip(*points),marker="o");plt.xlabel("Time [s]");plt.ylabel("Sensor value");plt.grid()
[('m1', 0.0, 20.0), ('m1', 1.0, 22.0), ('m1', 2.0, 23.0)]
실행 결과

공식 문서·데이터

참고 예제

추가 예제 보기

참고 자료