使用python将树莓pi传感器输入到sqlite3数据库

jc3wubiy  于 2022-12-13  发布在  SQLite
关注(0)|答案(1)|浏览(247)

我正在使用DS18B20温度传感器和树莓派3。我想把日期/时间和温度数据,并把它放入一个sql数据库(稍后将发布到一个网站托管的pi...还没有得到那么远)
我找到了一个python脚本来读取传感器数据,它运行得很好。然后我添加了SQL部分,虽然它看起来工作正常(没有出现错误...),但它似乎根本没有更改数据库。我不知道它是否真的更改了表(我只是没有找对地方),或者它没有(我哪里出错了)

import os                                               # import os module
import glob                                             # import glob module
import time                                             # import time module
import sqlite3

conn = sqlite3.connect('Temperature.db')
c = conn.cursor()

os.system('modprobe w1-gpio')                          # load one wire comm$
os.system('modprobe w1-therm')
base_dir = '/sys/bus/w1/devices/'                      # point to the addre$
device_folder = glob.glob(base_dir + '28*')[0]         # find device with a$
device_file = device_folder + '/w1_slave'              # store the details
def read_temp_raw():
   f = open(device_file, 'r')
   lines = f.readlines()                               # read the device de$
   f.close()
   return lines

def read_temp():
   lines = read_temp_raw()
   while lines[0].strip()[-3:] != 'YES':              # ignore first line
      time.sleep(0.2)
      lines = read_temp_raw()
   equals_pos = lines[1].find('t=')                   # find temperature i$
   if equals_pos != -1:
      temp_string = lines[1][equals_pos+2:]
      temp_c = float(temp_string) / 1000.0            # convert to Celsius
      return temp_c

while True:
   date= (time.strftime("%Y-%m-%d ") + time.strftime("%H:%M:%S")) 
   temp=(read_temp())                               
   c.execute("INSERT INTO readings (date,temp) VALUES(?,?)", (date,temp))

   conn.close()
   break

sqlite3数据库名为Temperature.db,只有一个表“readings”
我真的是新的在这方面,所以任何建议是非常感谢。

fhg3lkii

fhg3lkii1#

无论何时使用Insert或Update语句,都需要将更改提交到数据库。只需在服务器连接上调用commit()即可。
另外,另一个问题是您关闭了数据库连接。您不希望在while循环中关闭数据库连接,因为在关闭了与数据库的连接后,您将无法向数据库中插入新条目。相反,您可以关闭游标连接,并在需要执行新事务时创建一个新连接。

while True:
   c = conn.cursor()
   date= (time.strftime("%Y-%m-%d ") + time.strftime("%H:%M:%S")) 
   temp=(read_temp())                               
   c.execute("INSERT INTO readings (date,temp) VALUES(?,?)", (date,temp))
   conn.commit()
   c.close()
   break

如果您阅读文档herecommit()函数提交当前数据库事务。当您在数据库连接上调用close()时,它不会提交自上次事务以来的任何更改。
一个更好的做法是使用Try-Except子句,如果数据库有问题,该子句将调用rollback()

conn = sqlite3.connect('test.db')
try:
    cur = conn.cursor()
    cur.execute(query, data)
    conn.commit()
except Exception as e:
    print(e)
    conn.rollback()
conn.close()

相关问题