標籤:樹莓派 sqlite python
0 前言 本文使用python向SQLite資料庫中插入樹莓派溫度資料,SQLite資料庫中包含一張只包含三個欄位的記錄表——參數名稱,時間和溫度值。本文重點解釋Python操作SQlite的具體方法,由於網上資料眾多,重複部分不再複述只做到具體情況具體分析。 【相關博文】 【樹莓派學習筆記——索引博文】——更多博文請關注。 【樹莓派學習筆記——擷取樹莓派CPU溫度】 【樹莓派學習筆記——定時向yeelink上傳樹莓派CPU溫度】 【樹莓派學習筆記——SQLite操作簡述】
1 建立資料庫和空表 【create-table-only.sql】
PRAGMA foreign_keys=OFF;BEGIN TRANSACTION;CREATE TABLE temps( name DEFAULT 'RPi.CPU', tdatetime DATETIME DEFAULT (datetime('now', 'localtime')), temperature NUMERIC NOT NULL);COMMIT;
【簡要說明】 【1】資料庫包含三個欄位,其中兩個欄位有預設值。 【2】溫度值不可為空。 【3】DEFAULT與NOT NULL約束配合,簡化插入操作。
【create-table-only.sh】#!/bin/shDBNAME="cpu.db"rm -f $DBNAMEecho 開始插入資料sqlite3 $DBNAME < create-table-only.sqlecho 插入完成 【簡要說明】 【1】chmod a+x create-table-only.sh增加可執行許可權 【2】運行之後在同目錄下建立名為cpu.db的資料庫
2 Python插入操作 建立一個名為db-insert-temp.py的檔案,具體內容如下
#!/usr/bin/env python# -*- coding: utf-8 -*-import timeimport sqlite3def get_cpu_temp(): # 開啟檔案 file = open("/sys/class/thermal/thermal_zone0/temp") # 讀取結果,並轉換為浮點數 temp = float(file.read()) / 1000 # 關閉檔案 file.close() return tempdef insert_cpu_temp(temp): # 串連資料庫 conn=sqlite3.connect('cpu.db') curs=conn.cursor() # 插入資料庫 strtemp = "%.1f" %(temp); curs.execute("INSERT INTO temps(temperature) VALUES((?))", (strtemp,)) conn.commit() # 關閉資料庫 conn.close()def main(): while True: temp = get_cpu_temp() insert_cpu_temp(temp) time.sleep(5*60) if __name__ == '__main__': main()
【簡單說明】 【1】conn=sqlite3.connect(‘cpu.db‘) 串連資料庫。 【2】curs=conn.cursor() 獲得遊標。遊標可理解為檔案操作控制代碼,有了它就可以擺弄"cpu.db"了。 【3】重點注意curs.execute("INSERT INTO temps(temperature) VALUES((?))", (strtemp,)) 【3.1】利用name和tdatetime的預設約束,此處僅插入溫度值 【3.2】execute函數中必須使用預留位置(?),不能使用字串格式化方法。如果還有兩個預留位置,建議寫成這樣VALUES((?),(?)) 【3.3】參數化查詢時 (strtemp,)為Python元組資料類型,如果只有一個元素時逗號不可省略。如果含有兩個參數,建議寫成這樣(paraA,paraB) 【4】勿忘提交操作conn.commit() 【5】勿忘關閉操作conn.close() 【查詢插入結果】 可在控制台中輸入 sqlite3 cpu-temp "SELECT * FROM temps;",返回結果如下。RPi.CPU|2014-08-03 10:40:40|48.7RPi.CPU|2014-08-03 10:41:41|48.7RPi.CPU|2014-08-03 10:42:41|49.2RPi.CPU|2014-08-03 10:43:41|48.7RPi.CPU|2014-08-03 10:44:41|48.7RPi.CPU|2014-08-03 10:45:41|49.2
3 開機後台運行 【啟動指令碼】——auto-start.sh 在該目錄下再建立一個auto-start.sh指令碼,具體內容如下#!/bin/bashcd /home/pi/python-works/cpu-temp python db-insert-temp.py & 【簡單說明】 【1】python db-insert-temp.py & 後台運行db-insert-temp.py 【2】勿忘修改執行許可權,chmod a+x auto-start.sh
【修改啟動項】——/etc/rc.local 在最後一行exit 0之前增加# 樹莓派溫度儲存到資料庫中/home/pi/python-works/cpu-temp/auto-start.sh start
【重新啟動樹莓派】 sudo reboot 重啟之後再次查看錶中內容,將會發現記錄一條一條增加。
4 總結 【1】python SQLite參數化操作時必須使用預留位置? 【2】參數為Python元群組類型,需要注意元素個數為1的情況。 【3】插入操作成功,結合Flask嘗試查詢操作。
5 參考資料 【1】SQLite 教程 | w3cschool菜鳥教程 【2】Python SQLite3協助文檔