Python向SQLite3记录传感器数据时的while循环冲突问题
解决霍尔效应传感器数据写入SQLite数据库的问题
嘿,我明白你的需求了——原来的脚本能正常显示转速、速度和距离,但现在要把这些数据持续写入halleffect.db,还要保留无限循环的逻辑,直到你手动停止对吧?这其实不难,咱们一步步来搞定:
核心思路
- 提前建立好SQLite连接和游标(别每次循环都开关连接,太影响效率)
- 在你原有的
while True循环里,把计算好的rpm、mps、distance插入数据库 - 处理优雅停止的逻辑(比如按Ctrl+C),确保数据都能提交,连接正常关闭
具体实现步骤
1. 先确认数据库表结构
如果你还没创建存储数据的表,先执行这段代码创建(已经有表的话跳过):
import sqlite3 # 连接数据库(不存在会自动创建) conn = sqlite3.connect('halleffect.db') cursor = conn.cursor() # 创建传感器数据表,自动记录时间戳 cursor.execute(''' CREATE TABLE IF NOT EXISTS sensor_readings ( id INTEGER PRIMARY KEY AUTOINCREMENT, recorded_at DATETIME DEFAULT CURRENT_TIMESTAMP, rpm REAL, mps REAL, distance REAL ) ''') conn.commit() cursor.close() conn.close()
2. 修改你的原有脚本,加入数据库写入逻辑
把原脚本的循环部分改成下面这样,我会标注需要替换成你原有代码的地方:
import sqlite3 import time # 导入你原脚本里的传感器相关模块/函数,比如RPi.GPIO之类的 # 初始化数据库连接(循环外只做一次) conn = sqlite3.connect('halleffect.db') cursor = conn.cursor() # 可选:设置一个计数器,批量提交数据提升效率(比如每10条提交一次) commit_counter = 0 COMMIT_INTERVAL = 10 try: while True: # -------------------------- # 替换成你原有的计算逻辑 # 比如读取霍尔传感器脉冲、计算rpm、mps、distance的代码 rpm = your_calculate_rpm_function() mps = your_calculate_mps_function(rpm) distance = your_calculate_distance_function(mps) # -------------------------- # 保留原有的显示功能 print(f"实时数据 -> RPM: {rpm:.2f}, 速度: {mps:.2f} m/s, 累计距离: {distance:.2f} m") # 写入数据库 cursor.execute(''' INSERT INTO sensor_readings (rpm, mps, distance) VALUES (?, ?, ?) ''', (rpm, mps, distance)) # 批量提交(可选,根据你的数据频率调整) commit_counter += 1 if commit_counter >= COMMIT_INTERVAL: conn.commit() commit_counter = 0 # 原脚本里的延迟(比如每秒读取一次,根据你的需求调整) time.sleep(1) # 处理手动停止(Ctrl+C) except KeyboardInterrupt: print("\n正在停止数据记录...") # 提交最后一批未保存的数据 conn.commit() finally: # 确保关闭数据库连接,避免数据损坏 cursor.close() conn.close() print("数据库连接已关闭,所有数据已保存!")
关键注意事项
- 不要频繁开关数据库连接:把连接放在循环外面,只初始化一次,否则会大幅降低性能,还可能导致数据库锁。
- 优雅停止很重要:用
try-except捕获KeyboardInterrupt,确保最后一批数据能提交,连接正常关闭,避免数据丢失。 - 批量提交优化:如果你的数据采样频率很高(比如每秒几十次),用计数器批量提交比每次插入都提交要高效得多,
COMMIT_INTERVAL可以根据你的需求调整。 - 时间戳自动记录:表结构里的
recorded_at字段用DEFAULT CURRENT_TIMESTAMP,会自动记录数据插入的时间,不用你手动生成时间戳。
这样修改后,你的脚本就能一边显示实时数据,一边无限期把数据写入数据库,直到你按Ctrl+C停止啦!
内容的提问来源于stack exchange,提问作者TheCodingBeefer
相关产品推荐
相关产品推荐

