嵌入式数据库-Sqlite3

阅读引言: 本文将会从环境sqlite3的安装、数据库的基础知识、sqlite3命令、以及sqlite的sql语句最后还有一个完整的代码实例, 相信仔细学习完这篇内容之后大家一定能有所收获。

目录

一、数据库的基础知识

1.数据库的基本概念

2.常用数据库

3.嵌入式数据库

4.sqlite3基础

5.创建数据库

6.数据库的相关术语

二.Sqlite3安装

三、Sqlite3命令

四、Sqlite3语句

五、Sqlite编程接口

六、代码实例

七、简单总结


一、数据库的基础知识

1.数据库的基本概念

数据(Data):能够输入计算机并能被计算机程序识别和处理的信息集合

数据库 (Database):数据库是在数据库管理系统管理和控制之下,存放在存储介质上的数据集合

2.常用数据库

大型数据库:

Oracle公司是最早开发关系数据库的厂商之一,其产品支持最广泛的操作系统平台。目前Oracle关系数据库产品的市场占有率名列前茅。

IBM 的DB2是第一个具备网上功能的多媒体关系数据库管理系统,支持包Linux在内的一系列平台。

中型数据库:

Server是微软开发的数据库产品,主要支持windows平台。

小型数据库:

mySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司,2008年被Sun公司收购,开放源码。

3.嵌入式数据库

基于嵌入式Linux的数据库主要有SQLite, Firebird, Berkeley DB, eXtremeDBFirebird是关系型数据库,功能强大,支持存储过程、SQL兼容等SQLite关系型数据库,体积小,支持ACID事务

Berkeley DB中并没有数据库服务器的概念,它的程序库直接链接到应用程序中eXtremeDB是内存数据库,运行效率高

4.sqlite3基础

SQLite的源代码是C,其源代码完全开放。SQLite第一个Alpha版本诞生于2000年5月。 他是一个轻量级的嵌入式数据库。

SQLite有以下特性:

  • 零配置无需安装和管理配置;
  • 储存在单一磁盘文件中的一个完整的数据库;
  • 数据库文件可以在不同字节顺序的机器间自由共享;
  • 支持数据库大小至2TB;
  • 足够小,全部源码大致3万行c代码,250KB;
  • 比目前流行的大多数数据库对数据的操作要快;

5.创建数据库

手工创建:

使用SQLite3工具,通过手工输入SQL命令行完成数据库创建,用户在Linux的命令行界面中输入SQLite3可启动SQLite3工具

代码创建:

在代码中常动态创建数据库,在程序运行过程中,当需要进行数据库操作时,应用程序会首先尝试打开数据库,此时如果数据库并不存在,程序则会自动建立数据库,然后再打开数据库

6.数据库的相关术语

数据库的相关术语有很多,以下是一些常见的数据库术语:

1. 数据库(Database):数据的集合,按照一定的数据模型组织和存储的集合。

2. 表(Table):用于存储数据的二维数据结构,由行(Record)和列(Field)组成。

3. 行(Record):表中的一条数据,也被称为记录或元组。

4. 列(Field):表中的一个属性,也被称为字段或列名。

5. 主键(Primary Key):表中用于唯一标识每条记录的字段或字段组合。

6. 外键(Foreign Key):表中用于建立与其他表之间关联关系的字段。

7. 索引(Index):加速数据检索的数据结构,通过对关键字段建立索引,可以快速定位数据。

8. 查询(Query):从数据库中检索数据的操作,通过使用SQL语言编写查询语句来实现。 9. SQL(Structured Query Language):结构化查询语言,用于管理和操作关系型数据库的标准语言。

10. 视图(View):虚拟表,基于一个或多个表的查询结果创建的,可以简化复杂的查询操作。

11. 触发器(Trigger):与表相关联的特殊类型的存储过程,在插入、更新或删除数据时自动触发执行。

12. 事务(Transaction):一组数据库操作,要么全部执行成功,要么全部回滚,保证数据的一致性和完整性。

13. 归范式(Normalization):为了避免数据冗余和不一致,对数据模型进行优化的过程。常见的归范式有第一范式(1NF)、第二范式(2NF)和第三范式(3NF)等。

14. 关系数据库管理系统(RDBMS):用于存储、管理和操作关系型数据库的软件系统,例如MySQL、Oracle、SQL Server等。 这些术语是数据库领域中常用的,理解这些术语可以帮助你更好地了解和使用数据库。

15.数据库管理者(database administrator)

二.Sqlite3安装

sudo apt-get install

dpkg -s sqlite3

按道理来讲, 到这一步就结束了, 但是在实际的代码编译中, 找不到sqlite3.h头文件, 也链接不到对应的sql接口的实现。大家安装完可以先去/usr/include目录下看有没有对应的头文件, 没有的话这样干。安装sqlite3的库包。

sudo apt-get install libsqlite3-dev

三、Sqlite3命令

注意都以'.'开头

         .exit 退出

         .quit 退出

         .table   查看表

         .schema  查看表的结构

        .open databasename 打开数据库

        .help 命令帮助

简单演示

四、Sqlite3语句

        1-- 创建一张表

            create table stuinfo(id integer, name text, age integer, score float);

         

        2-- 插入一条记录

            insert into stuinfo values(1001, 'zhangsan', 18, 80);

            insert into stuinfo (id, name, score) values(1002, 'lisi', 90);

        3-- 查看数据库记录

            select * from stuinfo;

            select * from stuinfo where score = 80;

            select * from stuinfo where score = 80 and name= 'zhangsan';

            select * from stuinfo where score = 80 or name='wangwu';

            select name,score from stuinfo;  查询指定的字段

            select * from stuinfo where score >= 85 and score < 90;

        4-- 删除一条记录

            delete from stuinfo where id=1003 and name='zhangsan';

        5-- 更新一条记录

            update stuinfo set age=20 where id=1003;

            update stuinfo set age=30, score = 82 where id=1003;

        6-- 删除一张表

            drop table stuinfo;

        7-- 增加一列

            alter table stuinfo add column sex char;

        8-- 删除一列

            create table stu as select id, name, score from stuinfo;    复制除了要删除的那一列,

            drop table stuinfo;   //删除原来的表

            alter table stu rename to stuinfo;    //把新建的表改为原来的表名

      设置主键并且该主键是自增的, 主键的意思就是唯一的意思, 比如一张表中的id号, 身份证号啥的。

     create table info(id integer primary key autoincrement, name vchar);


简单演示

五、Sqlite编程接口

  • int   sqlite3_open(char  *path,   sqlite3 **db)
    • 功能:打开sqlite数据库
    • path:数据库文件路径
    • db:指向sqlite句柄的指针
    • 返回值:成功返回0,失败返回错误码(非零值)
  • int   sqlite3_close(sqlite3 *db);
    • 功能:关闭sqlite数据库        
    • 返回值:成功返回0,失败返回错误码
  • const  char  *sqlite3_errmg(sqlite3 *db);        
    • 返回值:返回错误信息
  • Int sqlite3_exec(sqlite3 *db, const  char  *sql, sqlite3_callback callback, void *, char **errmsg);
    • 功能:执行SQL操作
    • db:数据库句柄
    • sqlSQL语句
    • callback:回调函数
    • errmsg:错误信息指针的地址
    • 返回值:成功返回0,失败返回错误码
  • typedef  int (*sqlite3_callback)(void *para, int f_num, char **f_value, char **f_name);
    • 功能:每找到一条记录自动执行一次回调函数
    • para:传递给回调函数的参数
    • f_num:记录中包含的字段数目
    • f_value:包含每个字段值的指针数组
    • f_name:包含每个字段名称的指针数组
    • 返回值:成功返回0,失败返回-1
  • 不使用回调函数执行SQL语句
  • int   sqlite3_get_table(sqlite3 *db, const  char  *sql,  char ***resultp,  int*nrow,  int *ncolumn, char **errmsg);
    • 功能:执行SQL操作
    • db:数据库句柄
    • sqlSQL语句
    • resultp:用来指向sql执行结果的指针
    • nrow:满足条件的记录的数目
    • ncolumn:每条记录包含的字段数目
    • errmsg:错误信息指针的地址
    • 返回值:成功返回0,失败返回错误码

六、代码实例

实例软件结构如下: 

Makefile

OBJ=$(wildcard ./*.c)
all:$(OBJ)
	gcc *.c -o test -lsqlite3

main.c

#include "sqlite_method.h"


/* hint user input */
void hint_display();

/* main */
int main(int argc, const char *argv[])
{
	sqlite3 *db;
	char *errmsg;
	char input;

	if(sqlite3_open(DATABASE_PATH, &db) != SQLITE_OK) {
		printf("%s\n", sqlite3_errmsg(db));
		return -1;
	} else {
		printf("open database [%s] success\n", DATABASE_PATH);
	}

	
	if(sqlite3_exec(db, "create table if not exists exercise(id integer, name text, score integer);", \
						NULL, NULL, &errmsg) != SQLITE_OK) {
		printf("sqlite3_exec failed, line: %d\n", __LINE__);
	}

	/* handle user input */
	while(1) {
		hint_display();	
		scanf("%c", &input);
		switch(input) {
		case 'i':
			insert_handle(db);
			getchar();
			break;
		case 'd':
			delete_handle(db);
			getchar();
			break;
		case 'q':
			query_handle(db);
			getchar();
			break;
		case 'u':
			update_handle(db);
			getchar();
			break;
		case '!':
			quit_handle(db);
			getchar();
			break;
		default:
			printf("invalid option!\n");
		}
	}


	return 0;
}

void hint_display()
{
	printf("**********************************************************\n");
	printf("*i: insert   d: delete    q: query    u: update    !:exit*\n");
	printf("**********************************************************\n");
}

sqlite_method.h

#ifndef _SQLITE_METHOD_H_
#define _SQLITE_METHOD_H_

/*Author: Hewei
 *Date: 2024-3-30
 *Brife: database operator
 * */

#include <sqlite3.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

#define DATABASE_PATH "./exercise.db"
#define N 256

void insert_handle(sqlite3 *db);
void delete_handle(sqlite3 *db);
void query_handle(sqlite3 *db);
void update_handle(sqlite3 *db);
void quit_handle(sqlite3 *db);





#endif

sqlite_method.c

#include "sqlite_method.h"


void insert_handle(sqlite3 *db)
{
	int id;
	char name[128] ={0};
	int score;
	char buff[N] = {0};
	char *errmsg;

	printf("Please input id:");
	scanf("%d", &id);
	printf("Please input name:");
	scanf("%s", name);
	
	//getchar();          method 1
	printf("Please input score:");
	//scanf("% c%d", &score);       method 2
	scanf("%*c%d", &score);

	sprintf(buff, "insert into exercise values(%d, '%s', %d)", id, name, score);

	if(sqlite3_exec(db, buff, NULL, NULL, &errmsg) != SQLITE_OK) {
		printf("%s\n", errmsg);
	} else {
		printf("\n\n\n");
		printf("insert operator success!|\n");
	}
	
}

void delete_handle(sqlite3 *db)
{
	int id;
	char buff[N] = {0};
	char *errmsg;

	printf("Please input delete id:");
	scanf("%d", &id);
	snprintf(buff, sizeof(buff), "delete from exercise where id = %d", id);


	if(sqlite3_exec(db, buff, NULL, NULL, &errmsg) != SQLITE_OK) {
		printf("%s\n", errmsg);
	} else {
		printf("\n\n\n");
		printf("delete operator success!|\n");
	}

}

int query_callback(void *arg, int f_num, char **value, char **name) 
{
	 int i;
	 static int count = 0;
	 if(count == 0) {
		for(i = 0; i < f_num; i++) {
			printf("%-10s", name[i]);	
		}
		count = 1;
		putchar(10);
	 }
	for(i = 0; i < f_num; i++) {
		printf("%-10s", value[i]);
	}
	puts("");

	return 0;
}


void query_handle(sqlite3 *db)
{	
	char buff[N] = {0};
	char *errmsg;

	sprintf(buff, "select * from exercise");
	if(sqlite3_exec(db, buff, query_callback, NULL, &errmsg) != SQLITE_OK) {
		printf("%s\n", errmsg);
	} else {
		printf("\n\n\n");
		printf("query operator success!|\n");
	}
	
}



void update_handle(sqlite3 *db)
{
	char buff[128];
	char *errmsg;
	int id, score;

	printf("Please input you want update id:");
	scanf("%d", &id);
	printf("Please input you want update score:");
	scanf("%d", &score);

	
	sprintf(buff, "update exercise set score = %d where id = %d\n", score, id);

	if(sqlite3_exec(db, buff, NULL, NULL, &errmsg) != SQLITE_OK) {
		printf("%s\n", errmsg);
	} else {
		printf("\n\n\n");
		printf("update operator success!\n");
	}
}

void quit_handle(sqlite3 *db)
{
	printf("\n\n\n");
	printf("database os exit success!\n");
	sqlite3_close(db);
	exit(1);
}

七、简单总结

1. 关系型数据库其实就是execl那种类似的表格, 不是什么高深的东西

2. Sqlite3的特点: 体积小、简单、高效、本地存储、源码开放。

好了, 老规矩希望对有需要的人有帮助。因为这个我实现得不是很规范,看不懂的地方随时欢迎私信。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在A中删除既在B表中出现又在C表中出现的元素

方法一&#xff08;感觉有点取巧&#xff0c;不太推荐&#xff0c;但是实现简单&#xff09;&#xff1a; 算法思想:保留La的头节点&#xff0c;并用pcur指针指向La链中的第一个结点&#xff0c;通过pcur指针遍历La中的每一个元素&#xff0c;并判断该元素是否在Lb和Lc链中出现…

优化选址问题 | 基于帝国企鹅算法求解工厂-中心-需求点三级选址问题含Matlab源码

目录 问题代码问题 "帝国企鹅算法"并不是一个广为人知的优化算法,可能是一个特定领域或者特定情境下提出的方法。不过,对于工厂-中心-需求点三级选址问题,它可能是一种启发式优化方法,用于在多个候选位置中选择最优的工厂、中心和需求点位置。 这类问题通常涉及…

HAL STM32 硬件I2C方式读取AS5600磁编码器获取角度例程

HAL STM32 硬件I2C方式读取AS5600磁编码器获取角度例程 &#x1f4cd;相关篇《STM32 软件I2C方式读取AS5600磁编码器获取角度例程》 ✨stm32使用硬件I2C去读取角度数据&#xff0c;通过STM32CubeMX工具配置工程&#xff0c;读取角度数据&#xff0c;只需要调用一个函数&#xf…

css3之动画animation

动画animation 一.优点二.定义和使用三.动画序列和解释四.常见属性及解释五.简写&#xff08;名字和时间不能省略&#xff09;&#xff08;持续时间在何时开始的时间前&#xff09;&#xff08;简写中无animation-play-state)六.例子1.大数据热点图2.奔跑的熊大&#xff08;一个…

大模型与数据分析:探索Text-to-SQL

当今大模型如此火热&#xff0c;作为一名数据同学&#xff0c;持续在关注LLM是如何应用在数据分析中的&#xff0c;也关注到很多公司推出了AI数智助手的产品&#xff0c;比如火山引擎数智平台VeDI—AI助手、 Kyligence Copilot AI数智助理、ThoughtSpot等&#xff0c;通过接入人…

同一个主机配置多个SSH key

使用git时&#xff0c;我们可能一个git客户端使用多个git服务器&#xff0c;比如github&#xff0c;自建gitlab&#xff0c;gitee&#xff0c;为了防止提交混乱&#xff0c;所以需要一一对应生成公私钥。 第一步&#xff1a; 使用ssh-keygen生成多对密钥对&#xff0c;比如&…

深入理解SQLite:存储引擎、索引、事务与锁

文章目录 一、存储引擎二、索引的数据结构和类型2.1 B-Tree2.2 其他类型的索引2.3 小结 三、事务处理中的一致性问题3.1 脏读&#xff08;Dirty Read&#xff09;3.2 不可重复读&#xff08;Non-repeatable Read&#xff09;3.3 幻读&#xff08;Phantom Read&#xff09;3.4 小…

python实战之进阶篇(二)

一. python中的继承 二. 多继承 如果一个类继承了多个类, 多个父类中有相同的方法, 相同的方法则按照继承的顺序,继承第一个父类的 如果子类重写父类中继承的方法, 则子类中重写的方法生效 三. 继承与多态

数据结构03:栈、队列和数组 栈习题01[C++]

考研笔记整理~&#x1f95d;&#x1f95d; 之前的博文链接在此&#xff1a;数据结构03&#xff1a;栈、队列和数组_-CSDN博客~&#x1f95d;&#x1f95d; 本篇作为链表的代码补充&#xff0c;供小伙伴们参考~&#x1f95d;&#x1f95d; 第1版&#xff1a;王道书的课后习题…

ubuntu22.04@Jetson Orin Nano安装配置VNC服务端

ubuntu22.04Jetson Orin Nano安装&配置VNC服务端 1. 源由2. 环境3. VNC安装Step 1: update and install xserver-xorg-video-dummyStep 2: Create config for dummy virtual displayStep3: Add the following contents in xorg.conf.dummyStep 4: Update /etc/X11/xorg.con…

使用Flink实现MySQL到Kafka的数据流转换

使用Flink实现MySQL到Kafka的数据流转换 本篇博客将介绍如何使用Flink将数据从MySQL数据库实时传输到Kafka&#xff0c;这是一个常见的用例&#xff0c;适用于需要实时数据connector的场景。 环境准备 在开始之前&#xff0c;确保你的环境中已经安装了以下软件&#xff1a;…

再次加深理解Java中的并发编程

目录 一、线程、进程、程序 二、线程状态 三、线程的七大参数 四、lock与synchronized锁机制 一&#xff09;、lock与synchronized锁区别 二&#xff09;、synchronized锁原理 三&#xff09;、Lock锁原理 五、synchronized锁升级原理 一&#xff09;、锁升级基础知识 …

超文本传输协议HTTP

HTTP协议 在网络通信中&#xff0c;我们可以自己进行定制协议&#xff0c;但是也有许多已经十分成熟的应用层协议&#xff0c;比如我们下面说的HTTP协议。 HTTP协议简介 HTTP&#xff08;Hyper Text Transfer Protocol&#xff09;协议又叫做超文本传输协议&#xff0c;是一…

JAVAEE之网络编程

1.网络编程 网络编程&#xff0c;指网络上的主机&#xff0c;通过不同的进程&#xff0c;以编程的方式实现网络通信&#xff08;或称为网络数据传输&#xff09;。 当然&#xff0c;我们只要满足进程不同就行&#xff1b; 所以即便是同一个主机&#xff0c;只要是不同进程&am…

算法学习——LeetCode力扣图论篇1

算法学习——LeetCode力扣图论篇1 797. 所有可能的路径 797. 所有可能的路径 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个有 n 个节点的 有向无环图&#xff08;DAG&#xff09;&#xff0c;请你找出所有从节点 0 到节点 n-1 的路径并输出&#xff08;不要求按特…

elementui 导航菜单栏和Breadcrumb 面包屑关联

系列文章目录 一、elementui 导航菜单栏和Breadcrumb 面包屑关联 文章目录 系列文章目录前言一、elementui 导航菜单栏和Breadcrumb 面包屑怎么关联&#xff1f;二、实现效果三、实现步骤1.本项目演示布局2.添加面包屑2.实现breadcrumbName方法3.监听方法4.路由指配5.路由配置…

【C语言】Infiniband驱动mlx4_reset

一、注释 这个 mlx4_reset 函数负责重置 Mellanox 设备。它保存了设备的 PCI 头信息&#xff0c;然后重置了设备&#xff0c;之后还原保存的 PCI 头信息。请注意&#xff0c;该函数是用英文注释的&#xff0c;下面提供中文注释的版本。以下是该函数的流程&#xff1a; 1. 为保…

springboot项目学习-瑞吉外卖(4)续

1.任务 菜品的添加功能(涉及到两张表的数据添加) 2.菜品添加 功能页面如上&#xff0c;该页面有两个注意点 菜品分类&#xff1a;点击菜品分类后&#xff0c;会展示当前已有菜品&#xff1a;这个功能的实现要从category表里查询数据&#xff0c;然后再做展示口味做法配置&#…

SRS OBS利用RTMP协议实现音视频推拉流

参考&#xff1a;https://ossrs.net/lts/zh-cn/docs/v5/doc/getting-started 1&#xff09;docker直接运行SRS服务&#xff1a; docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080 registry.cn-hangzhou.aliyuncs.com/ossrs/srs:5运行起来后可以http://localho…

java Web 疫苗预约管理系统用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP 疫苗预约管理系统是一套完善的web设计系统&#xff0c;对理解JSP java 编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0&#xff0c;使…