树莓派学习笔记——SQLite操作简述

0 前言@H_502_6@@H_502_6@@H_502_6@
本文介绍如何在树莓派中利用sqlite数据库保存cpu温度数据。sqlite是一款轻量级零配置数据库,非常适合在树莓派和其他嵌入式系统中使用。sqlite文档详细资料丰富,本文不会详细解释sqlite数据库操作的方方面面,只能结合具体场景按需说明。本文介绍的sqlite技巧也可以在其他平台使用,并不局限于树莓派。
本文继续折腾树莓派温度,希望从中可以玩出新花样。

【相关博文】
树莓派学习笔记——索引博文】——更多博文请关注。

1 创建表和插入数据@H_502_6@@H_502_6@
新建一个名为insert.sql文件文件具体内容如下:
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;

CREATE TABLE temps(
    name TEXT DEFAULT 'RPi.cpu',tdatetime DATETIME DEFAULT (datetime('Now','localtime')),temperature NUMERIC NOT NULL
);
    
INSERT INTO temps 
VALUES('RPi.cpu',datetime('Now','localtime','-3 hours'),40.1);

INSERT INTO temps(name,tdatetime,temperature) 
VALUES('RPi.cpu','-2 hours'),40.2);

INSERT INTO temps(tdatetime,temperature) 
VALUES(datetime('Now','-1 hours'),40.3);

INSERT INTO temps(temperature)
VALUES(40.4);

COMMIT;
【简要说明】——若干细节请注意@H_502_6@@H_502_6@
【1】创建表,表中包括3个字段,分别为name,tdatetime和temperature。
【2】name DEFAULT 'RPi.cpu',name字段的认值为'RPi.cpu',sqlite中字符串被单引号包裹。
【3】tdatetime DATETIME DEFAULT (datetime('Now',tdatetime字段认值为当前时间。
【4】datetime('Now','localtime')中的localtime表示 本时区时间@H_502_6@,如果没有该参数则为格林尼治时间。
【5】DEFAULT (@H_502_6@datetime('Now','localtime') )@H_502_6@,括号绝对不能少@H_502_6@。DEFault中的表达式一定要被括号包裹。
【6】采用多种不同的插入方法,第一种不含字段名称,第二种包含字段名称,第三种,由于创建表格时有认值,可以使用更简洁的插入方法,例如
INSERT INTO temps(temperature) VALUES(40.4);

2 创建表和插入数据@H_502_6@@H_502_6@
创建一个名为create-table.sh脚本,具体内容如下
#!/bin/sh@H_502_6@
rm -f cpu.db@H_502_6@
echo 开始插入数据@H_502_6@
sqlite3 cpu.db < insert.sql@H_502_6@
echo 插入完成@H_502_6@
【简要说明】@H_502_6@@H_502_6@
【1】数据库名称cpu.db
【2】sqlite3 cpu.db < insert.sql 把insert.sql脚本插入到数据库中,insert.sql包括两个步骤,建立表并向表中插入数据。
【3】修改执行权限 chmod a+x create-tabel.sh,然后执行./create-table.sh
【4】sqlite也有命令行模式,但是命令没有历史查询功能,写错了还要重新写一遍,所有shell脚本指令更利于修改和尝试。

3 查询内容@H_502_6@@H_502_6@
【简单查询
新建一个名为show.sh的脚本,具体内容如下
#!/bin/sh@H_502_6@
dbnAME="cpu.db"@H_502_6@
sqlite3 $dbnAME "SELECT * FROM temps;"@H_502_6@
【简单说明】@H_502_6@@H_502_6@
【1】数据库名称cpu.db。
【2】sqlite3 $dbnAME "select * from temps;" 查询表中所有记录。
【3】修改执行权限 chmod a+x show.sh,然后执行./show.sh
【4】执行结果如下,从结果来看插入的时间间隔一个小时,符合预期效果
RPi.cpu|2014-08-02 17:27:47|40.1
RPi.cpu|2014-08-02 18:27:47|40.2
RPi.cpu|2014-08-02 19:27:47|40.3
RPi.cpu|2014-08-02 20:27:47|40.4

修改时间顺序】——时间倒序输出@H_502_6@@H_502_6@
#!/bin/sh@H_502_6@
dbnAME="cpu.db"@H_502_6@
sqlite3 $dbnAME "select * from temps ORDER BY tdatetime DESC;"@H_502_6@
【简单说明】@H_502_6@@H_502_6@
【1】ORDER BY tdatetime DESC 以tdatetime降序排列。
【2】输出结果
RPi.cpu|2014-08-02 20:27:47|40.4
RPi.cpu|2014-08-02 19:27:47|40.3
RPi.cpu|2014-08-02 18:27:47|40.2
RPi.cpu|2014-08-02 17:27:47|40.1

【限制时间】——返回最近3个小时的数据@H_502_6@@H_502_6@
#!/bin/sh@H_502_6@
dbnAME="cpu.db"@H_502_6@
sqlite3 $dbnAME "SELECT * FROM temps@H_502_6@
where tdatetime > datetime('Now','-3 hours')@H_502_6@
ORDER BY tdatetime ASC;"@H_502_6@
【简要说明】@H_502_6@
【1】datetime('Now','-3 hours') 表示当前时间3个小时之前的时间点,一定要加上localtime参数
【2】where tdatetime > datetime('Now','-3 hours') 限制条件3个小时之前到现在。
【3】输出结果如下,特别说明操作的时间约为22:05。
RPi.cpu|2014-08-02 19:27:47|40.3
RPi.cpu|2014-08-02 20:27:47|40.4

【限制时间】——查询某个时间段内数据@H_502_6@@H_502_6@
#!/bin/sh@H_502_6@
dbnAME="cpu.db"@H_502_6@
sqlite3 $dbnAME "SELECT * FROM temps@H_502_6@
where tdatetime > datetime('2014-08-02 19:00:00') and@H_502_6@
tdatetime <= datetime('2014-08-02 20:00:00');"@H_502_6@
@H_502_6@ 【简要说明】@H_502_6@
【1】2014-08-02 19:00:00 年必须占4个数字,其他必须占2个数字,不足时使用0不足。
【2】此处不需要增加localtime参数,具体原因未知。

5 总结@H_502_6@@H_502_6@
【1】创建表格时可使用DEFAULT约束,增加认值简化插入操作,避免空值。
【2】INSERT操作含有多种方法,根据实际情况选用。
【3】sqlite datetime函数需要指定localtime参数,指定本地时区。

6 参考资料@H_502_6@@H_502_6@

相关文章

SQLite架构简单,又有Json计算能力,有时会承担Json文件/RES...
使用Python操作内置数据库SQLite以及MySQL数据库。
破解微信数据库密码,用python导出微信聊天记录
(Unity)SQLite 是一个软件库,实现了自给自足的、无服务器...
安卓开发,利用SQLite实现登陆注册功能