【sqlite3】网络socket编程温度采集智能存储与上报项目技术------sqlite3数据库基础

项目源码:https://gitee.com/TJF865975/project1_ds18b20,此为本人gitee仓库,欢迎 Watch、Star、Fork。

1.sqlite3简介

SQLite3是一种轻量级的关系型数据库,可以在本地磁盘上存储数据。

2.sqlite3安装

sudo apt-get install sqlite3

3.系统命令

.help			//帮助
.quit			//退出
.exit			//退出
.schema			//查看表的结构图

4.sqlite3使用

4.1 打开数据库

使用命令行工具或SQLite客户端工具打开一个SQLite数据库文件,如:

sqlite3 mydatabase.db

如果文件不存在,则会自动创建一个新的数据库文件。

4.2 创建表格

使用CREATE TABLE命令创建一个新的表格,例如:

CREATE TABLE users ( id INTEGER PRIMARY KEY, name TEXT, age INTEGER );

上述语句创建了一个名为"users"的表格,其中包含三个列:id、name和age。

4.3 插入数据

使用INSERT INTO命令插入新的数据行,例如:

INSERT INTO users (name, age) VALUES ('Alice', 25);

上述语句将一行新的数据插入到"users"表格中,包含两个列:name和age,其中name为"Alice",age为25。

4.4 查询数据

使用SELECT语句查询表格中的数据行,例如:

SELECT * FROM users;

上述语句将返回"users"表格中的所有数据行。

4.5 更新数据

使用UPDATE语句更新表格中的数据行,例如:

UPDATE users SET age = 26 WHERE name = 'Alice';

上述语句将更新"users"表格中名为"Alice"的行的age列为26。
如果您想要修改SQLite数据库中某段数据的某个值,可以使用UPDATE语句。

UPDATE语句允许您更新一个或多个列的值,可以使用WHERE子句来指定要更新的特定行。下面是一个基本的UPDATE语句的语法:

UPDATE table_name SET column1 = new_value1, column2 = new_value2 WHERE some_column = some_value;

其中,table_name是要更新的表格的名称,column1和column2是要更新的列的名称,new_value1和new_value2是您要将这些列的值更新为的新值。WHERE子句用于指定要更新的特定行,some_column是用于指定行的列的名称,some_value是该列的值。
例如,如果您想要将users表格中id为1的用户的email更新为new_email@example.com,可以使用以下语句:

UPDATE users SET email = 'new_email@example.com' WHERE id = 1;

注意,如果没有WHERE子句,则将更新所有行。因此,请确保在更新数据之前指定WHERE子句,以便只更新您要更新的特定行。

4.6 删除数据

使用DELETE FROM语句删除表格中的数据行,例如:

DELETE FROM users WHERE name = 'Alice';

上述语句将删除"users"表格中名为"Alice"的行。
在 SQLite 中,删除数据的方式有以下几种:

  1. 使用 DELETE 语句删除单个或多个行。
  2. 使用 DROP TABLE 语句删除整个表。
  3. 使用 TRUNCATE TABLE 语句删除整个表的所有行。
  4. 使用 VACUUM 命令回收未使用的空间,从而删除已删除行占用的空间。
    以下是每种方式的详细说明:

4.6.1 DELETE 语句

使用 DELETE 语句删除单个或多个行:

DELETE FROM tableName WHERE condition;

其中,tableName 是要删除数据的表名,condition 是 WHERE 子句中的条件,指定要删除的行。如果 WHERE 子句为空,则将删除表中的所有行。

4.6.2 DROP TABLE 语句

使用 DROP TABLE 语句删除整个表:

DROP TABLE tableName;

其中,tableName 是要删除的表名。

注意:使用 DROP TABLE 将完全删除表,包括表结构和数据,因此在使用此语句之前,请确认您是否真的要删除整个表。

4.6.3 TRUNCATE TABLE 语句

使用 TRUNCATE TABLE 语句删除整个表的所有行:

TRUNCATE TABLE tableName;

其中,tableName 是要清空数据的表名。

注意:TRUNCATE TABLE 与 DELETE 不同,它将删除表中的所有行,但不删除表本身,也不返回被删除的行数。此外,TRUNCATE TABLE 不触发表的 DELETE 或 UPDATE 触发器。

4.6.4 VACUUM 语句

使用 VACUUM 命令回收未使用的空间,从而删除已删除行占用的空间:

VACUUM;

VACUUM 命令将重新组织表的物理存储,回收未使用的空间,并将被删除的行从表中完全删除。这可以使数据库文件更小,因为它将未使用的空间释放给操作系统。

4.7关闭数据库

关闭数据库 使用.exit命令或者关闭SQLite客户端工具来关闭数据库连接。
以上是SQLite3的基本用法和语法。实际使用时,可以通过SQLite的C/C++ API或者其他编程语言的SQLite封装库来与SQLite数据库进行交互。

5.sqlite数据类型

SQLite 支持以下数据类型:

  1. NULL:空值。
  2. INTEGER:带符号整数,包括 1、2、3、4、6 或 8 个字节,取决于值的大小。
  3. REAL:浮点数,存储为 8 字节的 IEEE 浮点数。
  4. TEXT:字符串,采用编码方式存储。
  5. BLOB:二进制数据,存储为输入的内容。

VARCHAR 是一种在关系数据库中常见的列类型,也是 SQLite 中的列类型之一。它用于存储可变长度的字符串。与 CHAR 类型不同,VARCHAR 类型只使用存储所需的空间,不会预分配固定的空间。VARCHAR 的最大长度取决于数据库的限制,通常为 65535 个字符。

在 SQLite 中,VARCHAR 列类型可以用 TEXT 类型代替,因为它们是同义词,实际上没有任何区别。例如,以下两个定义是等价的:

CREATE TABLE myTable (id INTEGER PRIMARY KEY, name VARCHAR(50)); CREATE TABLE myTable (id INTEGER PRIMARY KEY, name TEXT(50));

此外,SQLite 还支持列类型的别名,如 INT 和 BOOLEAN,这些别名与其他列类型完全相同。还有其他列类型的别名,如 VARCHAR,TEXT 和 CHARACTER,它们都是 TEXT 列类型的别名,都可以用来存储字符串。

6.sqlite3函数接口

int sqlite3_open(const char *filename, sqlite3 **ppDb)
/*功能:打开一个数据库参数:filename 数据库路径名,ppDb 数据库操作句柄(指针)返回值:成功 SQLITE_OK,出错错误码
*/
int sqlite3_close(sqlite3 *db)
/*功能:关闭数据库参数:db 操作数据库的指针返回值:成功,SQLITE_OK,出错错误码
*/
const char *sqlite3_errmsg(sqlite3 *db)
/*功能:通过db句柄,得到数据库操作的错误信息返回值:错误信息的首地址
*/
int sqlite3_exec(sqlite3 *db, const char *sql, int (*callback)(void *arg, char **, char**), void *arg, char**errmsg)
/*功能:执行一条sql语句参数:db 数据库操作句柄sql 一条sql语句callback 回调函数,查询语句时执行arg 给回调函数的参数errmsg 错误信息返回值:成功 SQLITE_OK
*/
int (*callback)(void *arg, int, char**, char**)
/*功能:查询结果,是一个函数指针类型,传递一个函数名即可
*/

7.代码实例

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
#define DATABASE "stu.db"//插入函数
int do_insert(sqlite3 * db)
{int id;char name[32] = {};int score;char sql[128] = {};    //拼接char *errmsg;printf("Input id:");scanf("%d", &id);getchar();printf("Input name:");scanf("%s", name);getchar();printf("Input score:");scanf("%d", &score);getchar();sprintf(sql, "insert into stu values(%d, '%s', %d);", id, name, score); //拼接完成if(sqlite3_exec(db, sql, NULL, NULL, &errmsg ) != SQLITE_OK){printf("%s\n", errmsg);}else{printf("Insert done.\n");	}return 0;	
}//删除函数按照id
int do_delete(sqlite3 * db)
{int id;char sql[128] = {};    //拼接char *errmsg;printf("Input id:");scanf("%d", &id);getchar();sprintf(sql, "delete from stu where id = %d", id); //拼接完成if(sqlite3_exec(db, sql, NULL, NULL, &errmsg ) != SQLITE_OK){printf("%s\n", errmsg);}else{printf("Delete done.\n");	}return 0;	
}
//更新函数按照输入id
int do_update(sqlite3 * db)
{int id;char sql[128] = {};    //拼接操作命令int score;char *errmsg;printf("Input update id:");scanf("%d", &id);getchar();printf("Update score:");scanf("%d", &score);getchar();sprintf(sql, "update stu set score = %d where id = %d", score, id); //拼接完成if(sqlite3_exec(db, sql, NULL, NULL, &errmsg ) != SQLITE_OK){printf("%s\n", errmsg);}else{printf("Update done.\n");	}return 0;	
}//查询函数用到的回调函数
int callback(void *para, int f_num, char **f_value, char **f_name)
{int i = 0;for(i = 0; i < f_num; i++){printf("%-11s", f_value[i]); //%-11s是格式符,左对齐,右边填充空格}putchar(10);   //输出码表中ASCII码10对应的字符,也就是换行return 0;
}//查询函数
int do_query(sqlite3 *db)
{char sql[128] = {};char *errmsg;sprintf(sql, "select * from stu;"); //查看整张表if(sqlite3_exec(db, sql, callback, NULL, &errmsg ) != SQLITE_OK){printf("%s\n", errmsg);}else{printf("Query done.\n");	}return 0;
}//查询函数,不使用回调函数
int do_query1(sqlite3 *db)
{char sql[128] = {};char *errmsg;char **resultp;  //二级指针取地址int nrow;  //定义一行int ncloumn;  //定义一列int index;int i, j;sprintf(sql, "select * from stu;"); //查看整张表if(sqlite3_get_table(db, sql, &resultp, &nrow, &ncloumn, &errmsg) != SQLITE_OK){printf("%s", errmsg);}else{printf("Query done.\n");}for(j = 0; j < ncloumn; j++){printf("%-11s ", resultp[j]);}putchar(10);index = ncloumn;  //跨过第一行的列开始for(i = 0; i < nrow; i++){for(j = 0; j < ncloumn; j++){printf("%-11s ", resultp[index++]);  //第一行的列都不打}putchar(10);}return 0;
}int main(int argc, const char *argv[])
{sqlite3 * db;char * errmsg;int cmd;if(sqlite3_open(DATABASE, &db) != SQLITE_OK){printf("%s\n",sqlite3_errmsg(db));return -1;}else{printf("Open DATABASE success.\n");}//创建一张数据库的表格,如果表格存在打印errmsg消息,不进行重复创建操作if(sqlite3_exec(db, "create table stu (id Integer, name char, score Integer);", NULL, NULL, &errmsg) != SQLITE_OK)                                     {printf("%s\n", errmsg);}else{printf("create table or open success.\n");		}	//输入cmd进行增、删、查、改、退出操作while(1){printf("********************************\n");printf("1:insert 2:delete 3:query 4:update 5:quit.\n");printf("********************************\n");printf("Input cmd: ");scanf("%d", &cmd);getchar();     //吃掉回车,吃掉多余字符switch(cmd){case 1:do_insert(db);break;case 2:do_delete(db);break;case 3://do_query(db);     //调用回调函数进行查阅do_query1(db);      //不调用回调函数进行查阅break;				case 4:do_update(db);break;		case 5:sqlite3_close(db);exit(0);		default:printf("Error!\n");		}}	
}

创作不易,一键三连,谢谢支持!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/793436.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸽哒言讯独家最新im即时通讯系统双端源码下载 (中越双语)带安卓未封装、苹果未封装、PC端(全开源)+部署教程

独家最新im即时通讯系统双端源码下载 &#xff08;中越双语&#xff09;带安卓未封装、苹果未封装、PC端&#xff08;全开源&#xff09;部署教程鸽哒IM即时通讯系统是一款类似于weixin的即时通讯软件&#xff0c;具有独立开发的特点。与网络其他聊天软件相比&#xff0c;即时聊…

文件同步工具哪个好

背景 今天介绍一款文件实时同步工具PanguFlow,它能够实时地监控源端文件夹的变化&#xff0c;然后将这种变化实时同步到目标端&#xff0c;对于文件灾备冗余的场景可谓是再合适不过了&#xff0c;一些老铁可能有这样的需求&#xff0c;比如两台服务器需要做文件的双机热备&…

【Python 进阶笔记1】__call__ 函数

1. 前言 __call__是Python中的一个特殊方法&#xff08;也称为魔法方法&#xff09;。当定义了这个方法后&#xff0c;这个类的实例&#xff08;对象&#xff09;可以像普通函数那样被调用。这意味着&#xff0c;如果你创建了一个该类的实例&#xff0c;你可以直接用括号传递参…

模拟退火遗传算法GASA-附MATLAB代码

模拟退火遗传算法&#xff08;Simulated Annealing Genetic Algorithm&#xff0c;SAGA&#xff09;结合了模拟退火算法&#xff08;Simulated Annealing&#xff0c;SA&#xff09;和遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;的优点&#xff0c;用于解…

软件测试用例(3)

目录 什么样的测试用例是一个好的测试用例 什么是测试用例的有效性? 测试用例的粒度和评价 粒度 评价 什么样的测试用例是一个好的测试用例 什么是测试用例的有效性? 测试用例的有效性指的是测试用例是否能够有效地检测出软件系统中的错误或问题. 一个有效的测试用例应…

956: 约瑟夫问题的实现

【学习版】 【C语言】 #include <iostream> #include <string> #include <algorithm> #include <cmath> #include <cstdlib> using namespace std; typedef struct Lnode {int date;struct Lnode* next; }Lnode, * Linklist; int In(Linklist&…

查看Git用户名/密码/邮箱,及设置git配置

一、查看信息&#xff1a; 查看用户名 &#xff1a;git config user.name 查看密码&#xff1a; git config user.password 查看邮箱&#xff1a;git config user.email 二、设置信息&#xff08;--global 全局设置&#xff09; git config --global user.name "xxxx名称…

如何开发创建自己的npm包并成功发布、维护至npm官方网站

npm&#xff0c;全称为Node Package Manager&#xff0c;是专为JavaScript生态系统设计的软件包管理系统&#xff0c;尤其与Node.js平台紧密关联。作为Node.js的默认包管理工具&#xff0c;npm为开发者提供了便捷的方式来安装、共享、分发和管理代码模块。 npm作为JavaScript世…

ROS 2边学边练(12)-- 创建一个工作空间

上一篇我们已经接触过工作空间的概念&#xff0c;并简单了解体验了一点构建包、测试包的流程&#xff0c;此篇会深入一点学习工作空间相关内容。 前言 一个工作空间是包含了ROS 2的功能包的目录&#xff08;文件夹&#xff09;&#xff0c;在使用ROS 2之前我们得激活一下目标工…

Codeforces CodeTON Round 8(Div.1 + Div.2) A~E

A. Farmer John’s Challenge (模拟) 题意&#xff1a; 构造一个长度为 n n n的数组&#xff0c;将这些数组围成一个圈&#xff08;顺时针&#xff09;从任意一个位置打开&#xff0c;有且仅有 k k k个非降序排列的数组。 分析&#xff1a; k 1 k1 k1时&#xff0c;升序输…

如何删除 iPhone 上的 iCloud 激活锁

Apple 在 iPhone 上通过不同的安全屏障来保护您的数据。 iCloud 激活锁可阻止外部人员访问您的手机。您可以通过打开“查找我的 iPhone”功能来激活此锁。 使用安全协议似乎是无害的&#xff0c;直到你到达门的另一边。如果您购买了带有激活锁的二手 iPhone 或忘记了 iCloud 凭…

如何在Bash中连接字符串变量

问题&#xff1a; 在 PHP 中&#xff0c;字符串按如下方式连接在一起&#xff1a; $foo "Hello"; $foo . " World";在这里&#xff0c;$foo 变成了 "Hello World"。 在 Bash 中如何实现这一点? 回答1&#xff1a; foo"Hello" fo…

「精细化管理」某物业集团精细化管理咨询项目纪实

实现工作例行化、定时化、程序化与可视化企业重视绩效考核&#xff0c;却总感觉考核不到点上&#xff1b;企业重视规划职责&#xff0c;却总感觉部门间职责不清&#xff1b;企业重视激励&#xff0c;却总感觉难以真正激励员工。到底是哪里出了问题&#xff1f;华恒智信指出&…

sky 06笔记中

1.进阶的hello verilog module hello_verilog ();parameter clk_cyc 10.0;//定义常量reg clk,rstn; reg [31:0] a;always #(clk_cyc/2.0) clk ~clk;initial begin$display("Hello Verilog.\n"); endinitial beginclk 0; rstn 0;(posedge clk); //等待时钟上升沿…

win11安装WSL UbuntuTLS

win11安装WSL WSL 简介WSL 1 VS WSL 2先决要求安装方法一键安装通过「控制面板」安装 WSL 基本命令Linux发行版安装Ubuntu初始化相关设置root用户密码网络工具安装安装1panel面板指导 WSl可视化工具问题总结WSL更新命令错误Ubuntu 启动初始化错误未解决问题 WSL 简介 Windows …

【QT+QGIS跨平台编译】056:【pdal_kazhdan+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、pdal_kazhdan介绍二、pdal下载三、文件分析四、pro文件五、编译实践一、pdal_kazhdan介绍 pdal_kazhdan 是 PDAL(Point Data Abstraction Library)相关的 Kazhdan 算法的实现。PDAL 是一个用于处理和分析点云数据的开源库,而 Kazhdan 算法通常…

Java面试题:请解释Java中的策略模式?

Java中的策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一系列的算法&#xff0c;并将每一个算法封装起来&#xff0c;使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户。 策略模式的关键特点如下&#xff1a; 定义…

C语言 | Leetcode C语言题解之第9题回文数

题目&#xff1a; 题解&#xff1a; bool isPalindrome(int x) {if(x < 0)return false;long int sum0;long int nx;while(n!0){sumsum*10n%10;nn/10;}if(sumx)return true;elsereturn false; }

LLaMA-Factory微调(sft)ChatGLM3-6B保姆教程

LLaMA-Factory微调&#xff08;sft&#xff09;ChatGLM3-6B保姆教程 准备 1、下载 下载LLaMA-Factory下载ChatGLM3-6B下载ChatGLM3windows下载CUDA ToolKit 12.1 &#xff08;本人是在windows进行训练的&#xff0c;显卡GTX 1660 Ti&#xff09; CUDA安装完毕后&#xff0c…

前端路径问题总结

1.相对路径 不以/开头 以当前资源的所在路径为出发点去找目标资源 语法: ./表示当前资源的路径 ../表示当前资源的上一层路径 缺点:不同位置,相对路径写法不同2.绝对路径 以固定的路径作为出发点作为目标资源,和当前资源所在路径没关系 语法:以/开头,不同的项目中,固定的路径…