標籤:樹莓派 cpu溫度
0 前言 本文通過Python SQLite查詢樹莓派CPU的溫度曆史資料,在前面的博文中已經介紹了樹莓派CPU溫度擷取,SQLite操作和利用Python插入曆史資料,下面再介紹如何查詢資料,本文主要分為三部分,第一部分為查詢所有溫度記錄,第二部分獲得最近一小時資料,第三部分為把獲得結果格式化為字典類型。 【相關博文】 【樹莓派學習筆記——索引博文】——更多博文請關注。 【樹莓派學習筆記——擷取樹莓派CPU溫度】 【樹莓派學習筆記——定時向yeelink上傳樹莓派CPU溫度】 【樹莓派學習筆記——SQLite操作簡述】 【樹莓派學習筆記——Python SQLite插入溫度記錄】
1 查詢記錄條數 建立一個名為query-cpu-temp.py的檔案,檔案內容如下。
# -*- coding: utf-8 -*-import sqlite3# 串連資料庫con = sqlite3.connect("cpu.db")cur = con.cursor()name = 'RPi.CPU'# 查詢記錄總數cur.execute("select count(*) from temps where name=(?);", (name, ))total = cur.fetchone()# 返回元群組類型print type(total)print type(total[0]) print total[0]
【簡要說明】 【1】cur.execute("select count(*) from temps where name=(?);", (name, )) 查詢表中欄位name為RPi.CPU的記錄總數 【2】cur.fetchone() 獲得一條記錄,返回的結果為元群組類型。 【3】total[0],返回的結果為只有一個元素的元群組類型,total[0]為記錄總數,類型為Int。 【4】返回結果<type ‘tuple‘><type ‘int‘>166
2 查詢最近一小時溫度 重新修改query-cpu-temp.py,具體內容如下
# -*- coding: utf-8 -*-import sqlite3# 串連資料庫con = sqlite3.connect("cpu.db")cur = con.cursor()name = 'RPi.CPU'# 查詢資料庫,獲得最近一小時的記錄cur.execute('''SELECT * FROM temps WHERE name=(?) AND tdatetime > datetime('now', 'localtime', '-1 hours') ORDER BY tdatetime ASC;''', (name, ))# 獲得所有結果 rows = cur.fetchall()for row in rows: print row
【簡要說明】 【1】WHERE name=(?) AND tdatetime > datetime(‘now‘, ‘localtime‘, ‘-1 hours‘) ,查詢一小時之前的溫度參數, ‘localtime‘表示本時區時間。 【2】cur.fetchall() 獲得合格所有記錄。 【3】返回的結果為清單類型,而類表中的每個元素為元群組類型(u‘RPi.CPU‘, u‘2014-08-04 20:07:53‘, 46.5)(u‘RPi.CPU‘, u‘2014-08-04 20:12:53‘, 46.5)(u‘RPi.CPU‘, u‘2014-08-04 20:17:53‘, 46.5)(u‘RPi.CPU‘, u‘2014-08-04 20:22:54‘, 47.1)(u‘RPi.CPU‘, u‘2014-08-04 20:27:54‘, 47.1)(u‘RPi.CPU‘, u‘2014-08-04 20:32:54‘, 47.6)(u‘RPi.CPU‘, u‘2014-08-04 20:37:54‘, 46.5)(u‘RPi.CPU‘, u‘2014-08-04 20:42:54‘, 47.6)(u‘RPi.CPU‘, u‘2014-08-04 20:47:54‘, 47.1)(u‘RPi.CPU‘, u‘2014-08-04 20:52:54‘, 47.1)(u‘RPi.CPU‘, u‘2014-08-04 20:57:54‘, 47.6)(u‘RPi.CPU‘, u‘2014-08-04 21:02:55‘, 47.6)
3 轉化為字典格式的Factory 方法 在進行網路傳輸的過程中,多數通過JSON資料格式進行交換,在python中字典格式能更好的轉換為JSON格式。
# -*- coding: utf-8 -*-import sqlite3def dict_factory(cursor, row): d = {} for idx, col in enumerate(cursor.description): d[col[0]] = row[idx] return d# 串連資料庫con = sqlite3.connect("cpu.db")# 指定Factory 方法con.row_factory = dict_factorycur = con.cursor()name = 'RPi.CPU'# 查詢資料庫,獲得最近一小時的記錄cur.execute('''SELECT * FROM temps WHERE name=(?) AND tdatetime > datetime('now', 'localtime', '-1 hours') ORDER BY tdatetime ASC;''', (name, )) rows = cur.fetchall()for row in rows: print row
【簡單說明】 【1】def dict_factory(cursor, row): 元群組類型轉換為字典類型,該函數來自python sqlite說明文檔。 【2】con.row_factory = dict_factory 指定Factory 方法 【3】返回結果,請注意()變為了{},表明返回結果為字典類型。{‘tdatetime‘: u‘2014-08-04 20:22:54‘, ‘name‘: u‘RPi.CPU‘, ‘temperature‘: 47.1}{‘tdatetime‘: u‘2014-08-04 20:27:54‘, ‘name‘: u‘RPi.CPU‘, ‘temperature‘: 47.1}{‘tdatetime‘: u‘2014-08-04 20:32:54‘, ‘name‘: u‘RPi.CPU‘, ‘temperature‘: 47.6}{‘tdatetime‘: u‘2014-08-04 20:37:54‘, ‘name‘: u‘RPi.CPU‘, ‘temperature‘: 46.5}{‘tdatetime‘: u‘2014-08-04 20:42:54‘, ‘name‘: u‘RPi.CPU‘, ‘temperature‘: 47.6}{‘tdatetime‘: u‘2014-08-04 20:47:54‘, ‘name‘: u‘RPi.CPU‘, ‘temperature‘: 47.1}{‘tdatetime‘: u‘2014-08-04 20:52:54‘, ‘name‘: u‘RPi.CPU‘, ‘temperature‘: 47.1}{‘tdatetime‘: u‘2014-08-04 20:57:54‘, ‘name‘: u‘RPi.CPU‘, ‘temperature‘: 47.6}{‘tdatetime‘: u‘2014-08-04 21:02:55‘, ‘name‘: u‘RPi.CPU‘, ‘temperature‘: 47.6}{‘tdatetime‘: u‘2014-08-04 21:07:55‘, ‘name‘: u‘RPi.CPU‘, ‘temperature‘: 47.1}{‘tdatetime‘: u‘2014-08-04 21:12:55‘, ‘name‘: u‘RPi.CPU‘, ‘temperature‘: 47.1}{‘tdatetime‘: u‘2014-08-04 21:17:55‘, ‘name‘: u‘RPi.CPU‘, ‘temperature‘: 47.6}
4 總結 【1】獲得資料庫記錄的方法有 fetchone和fetchall。 【2】預設情況下返回元組結果。 【3】需要通過修改row_factory屬性,把元群組類型轉換為字典類型。
5 參考資料 【1】Python SQLite說明文檔——sqlite3.Connection.row_factory 【2】Accessing an SQLite database with Python