You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python向SQLite3记录传感器数据时的while循环冲突问题

解决霍尔效应传感器数据写入SQLite数据库的问题

嘿,我明白你的需求了——原来的脚本能正常显示转速、速度和距离,但现在要把这些数据持续写入halleffect.db,还要保留无限循环的逻辑,直到你手动停止对吧?这其实不难,咱们一步步来搞定:

核心思路

  1. 提前建立好SQLite连接和游标(别每次循环都开关连接,太影响效率)
  2. 在你原有的while True循环里,把计算好的rpm、mps、distance插入数据库
  3. 处理优雅停止的逻辑(比如按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:38:16