【DigiKey“智造万物,快乐不停”创意大赛】6-使用sqlite数据库保存数据
[复制链接]
在本例中会接收到下位机上传的温度数据,数据是上传到mqtt服务器的,通过订阅相关的消息,获得下位机的数据,不同的下位机使用不同的ID号,所以下位机上传的数据中包括ID号、温度,2个数据。需要将这些数据保存到数据库中。不同ID号的数据放在数据库的不同表中。
在前面的帖子中,已经能够通过python订阅到相关的mqtt消息了,现在需要使用python编写数据库的代码。而python内置了简单的数据库sqlite3,通过它可以快速的创建数据库。
连接/创建数据库
连接数据库,代码如下,这会在文件夹下创建一个db文件。
import sqlite3
from sqlite3 import Error
import datetime
db_name = "mydatabase.db"
def sql_connection():
try:
con = sqlite3.connect(db_name)
return con
except Error:
print(Error)
关闭数据库
def sql_close(con):
con.close()
向数据库中保存数据
数据是保存在表中的,这里打算是不同id上传的数据放在不同的表中。在创建新表之前要先检查是否已经有了这个表。
sqlite的语句中,可以使用占位符,但是表名好像不能用占位符,所以表名是通过格式化字符串放入到命令中的,而数据则是通过占位符添加进去的。代码如下,创建的表中包含3个数据:id、温度和时间。
def put_data_to_db(con,id,temperature):
cursorObj = con.cursor()
cmd = 'create table if not exists %s(id text, temperature real, time text)'%id
cursorObj.execute(cmd)
time = datetime.datetime.now()
time = time.strftime('%Y-%m-%d %H:%M:%S')
cmd = 'INSERT INTO %s VALUES (?,?,?)'%id
cursorObj.execute(cmd,(id,temperature,time))
con.commit()
def save_temperature(id, temperature):
con = sql_connection()
put_data_to_db(con,id,temperature)
sql_close(con)
获取表格中的数据
def get_data_number(con,id): #获取表格中数据的总数
cursorObj = con.cursor()
cmd = 'SELECT * FROM %s '%id
cursorObj.execute(cmd)
rows = cursorObj.fetchall()
number = len(rows)
return number
def get_id_temperature(con,id,index):#返回相应索引的数据,是个列表格式的
number = get_data_number(con,id)
if index > number:
return []
else:
cursorObj = con.cursor()
cmd = 'SELECT * FROM %s '%id
cursorObj.execute(cmd)
rows = cursorObj.fetchall()
return rows[-1*index]
获取全部的表格
def get_all_id(con): #返回的列表格式的
cursorObj = con.cursor()
cursorObj.execute('SELECT name from sqlite_master where type= "table"')
return cursorObj.fetchall()
测试代码
if __name__ == '__main__':
save_temperature('T0001', 27)
con = sql_connection()
get_data_number(con,'T0001')
get_id_temperature(con,'T0001',4)
a = get_all_id(con)
print(a)
sql_close(con)
通过上面的代码就能实现数据库数据的保存与读取了,接下来就是将mqtt订阅的数据通过json的解析,获得id和温度数据,然后保存的数据库中。
|