SQLite3

数据库简介

常用的数据库

大型数据库:Oracle
中型数据库:Server 是微软开发的数据库产品,主要支持 windows 平台。
小型数据库:mySQL 是一个小型关系型数据库管理系统,开放源码 。(嵌入式不需要存储太多数据。)

SQLite 基础

SQLite 的源代码是 C,其源代码完全开放,是一个轻量级的嵌入式数据库。

特性:

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

创建 SQLite 数据库:

-----------------两种方式都会用得到,重点是代码创建--------------------

手工创建:

使用 sqlite3 工具,通过手工输入 SQL 命令行完成数据库创建。

代码创建:

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

Linux 虚拟机中 sqlite3 的安装

在线安装方式

1) 确保虚拟机能联网
2)
● sudo apt-get update
● sudo apt-get install sqlite3
● sudo apt-get install libsqlite3-dev
● sudo apt-get install sqlitebrowser
安装软件及开发环境
—>sqlite3 数据库软件
—>sqlite3 数据库开发支持库
—>sqlite3 数据库操作软件
3) 安装成功后,终端输入以下指令,判断是否安装成功:

sqlite3  my.db

出现下列语句,表示安装成功,版本不一样无所谓,只要出现“sqlite>”即可,输入“.quit”退出数据库:
在这里插入图片描述

基础 SQL语句 的使用

两种命令格式:

sqlite3 系统命令

—— 以“.”开头;

SQL 命令

—— 以“;”结尾。

API 接口

(👆 跳转至 SQLite 官网)常用接口见 “sqlite3 编程”。
在这里插入图片描述

sqlite3 的使用:

1、创建一个数据库(数据库为空时,找不到图标);
在这里插入图片描述

2、在新建的数据库中,创建一张表,并设置主键;(表格创建成功后,数据库的图标显现)
在这里插入图片描述

3、向新建的表中插入数据;
在这里插入图片描述
在这里插入图片描述

4、查询表格中的数据;
在这里插入图片描述

在这里插入图片描述

5、打开图形化数据库;
在这里插入图片描述

6、删除表中一行;
在这里插入图片描述

7、删除整张表;
在这里插入图片描述

8、删除数据库;
在这里插入图片描述

sqlite3 编程

(👆 跳转至 SQLite 官网)
在这里插入图片描述

sqlite3_open

#include<sqlite3.h>
int  sqlite3_open(char *path, sqlite3 **db);功能:打开 sqlite 数据库(或新建数据库) 
参数:path:	数据库文件路径         db: 		指向数据库句柄的指针 - 该二级指针指向一级指针,最终会存储打开的数据库的首地址
返回值:成功返回0,失败返回错误码(非零值)	使用: 	sqlite3 *db;if(sqlite3_open("stu.db", &db) != 0)fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db));// sqlite3 自带的打印错误信息	值传递:   获取到值
地址传递: 修改值

sqlite3_close

#include<sqlite3.h>
int  sqlite3_close(sqlite3 *db);功能:关闭 sqlite 数据库
参数:db
返回值:成功返回0,失败返回错误码

sqlite3_errmsg

#include<sqlite3.h>
const  char  *sqlite3_errmsg(sqlite3 *db);
功能:  打印错误信息
参数:db
返回值:返回错误信息
使用(e.g.):   fprintf(stderr, "sqlite3_open failed: %s\n", sqlite3_errmsg(db));

sqlite3_exec

原型:int sqlite3_exec(sqlite3 *db,                               		/* An open database */const char *sql,                           		/* SQL to be evaluated */int (*callback)(void*, int, char**, char**),  	/* Callback function */void *arg,                                 		/* 1st argument to callback */char **errmsg                              		/* Error msg written here */);功能:执行sql语句;
参数:sqlite3 *db:		指定要操作的数据库句柄指针;char *sql:			指定要执行的sql语句;int (*callback)(void*, int, char**, char**):回调函数; 该函数指针可以指向返回值是int类型,参数列表是(void*, int, char**, char**)的函数void *arg:			传递给回调函数的第一个参数;  - 类似线程函数传参,需强转 - 不传参可以填 NULLchar **errmsg:	该二级指针指向的一级指针会存储错误信息的首地址,错误信息存储在静态存储区;(定义一个一级指针即可)                                   
返回值:成功:返回 SQLITE_OK,即 0;失败:返回 error_code,即非 0
// sqlite3.c#include <stdio.h>
#include <sqlite3.h>int num;
char buf[128] = {};
typedef struct{int id;char name[32];float score;
} STU; int main(int argc, char const *argv[])
{sqlite3 *db = NULL;if (sqlite3_open("/home/hq/MyFolders/sqlite3/testdb.db", &db)){fprintf(stderr, "Sqlite3_open failed: %s\n", sqlite3_errmsg(db));return -1;}char *errmsg = NULL;if (sqlite3_exec(db, "CREATE TABLE stu(id int primary key, name char, score float);",NULL, NULL, &errmsg)){fprintf(stderr, "Failed to create a table named \"stu\": %s\n", errmsg);return -1;}if (sqlite3_exec(db, "INSERT INTO stu VALUES(2023052201, \"Frank\", 95);", NULL, NULL, &errmsg)){fprintf(stderr, "Failed to insert: %s\n", errmsg);return -1;}printf("Please input a number:\n");scanf("%d", &num);STU stu;for (int i = 0; i < num; i++){scanf("%d %s %f", &stu.id, stu.name, &stu.score);sprintf(buf, "INSERT INTO stu VALUES(%d, \"%s\", %f);", stu.id, stu.name, stu.score);if (sqlite3_exec(db, buf, NULL, NULL, &errmsg)){fprintf(stderr, "Failed to insert: %s\n", errmsg);return -1;}}sqlite3_close(db);return 0;
}

运行结果如下:
在这里插入图片描述
在这里插入图片描述

sqlite3_exec 的 回调函数 callback

int callback(void *arg, int columns, char **column_text, char **column_name);功能:sqlite3_exec 每找到一条满足条件的记录,就会执行一次回调函数。
参数:void *arg:		sqlite3_exec 的第四个参数传入;int columns:	查询结果的列数;char **column_text:该二级指针指向一个指针数组,数组中的元素都是 char*类型 的指针,指针指向查询结果的内容;char **column_name:该二级指针指向一个指针数组,数组中的元素都是 char*类型 的指针,指针指向查询结果的列名;
返回值:成功时候必须返回0,该返回值会返回给 sqlite3_exec 函数,如果没有返回0,则 sqlite3_exec 会认为回调函数运行失败,从而导致 sqlite3_exec 运行失败。 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

// sqlite3.c#include <stdio.h>
#include <sqlite3.h>int num;
char buf[128] = {};
typedef struct{int id;char name[32];float score;
} STU; int select_cback(void *arg, int columns, char **column_text, char **column_name){printf("columns: %d\n", columns);printf("column_name: ");for (int i = 0; i < columns; i++)printf("%-12s", column_name[i]); putchar(10);printf("column_text: ");for (int i = 0; i < columns; i++)printf("%-12s", column_text[i]);putchar(10);return 0;
}int main(int argc, char const *argv[])
{sqlite3 *db = NULL;if (sqlite3_open("/home/hq/MyFolders/sqlite3/testdb.db", &db)){fprintf(stderr, "Sqlite3_open failed: %s\n", sqlite3_errmsg(db));return -1;}char *errmsg = NULL;if (sqlite3_exec(db, "CREATE TABLE stu(id int primary key, name char, score float);",NULL, NULL, &errmsg)){fprintf(stderr, "Failed to create a table named \"stu\": %s\n", errmsg);}if (sqlite3_exec(db, "INSERT INTO stu VALUES(2023052201, \"Frank\", 95);", NULL, NULL, &errmsg)){fprintf(stderr, "Failed to insert: %s\n", errmsg);return -1;}printf("Please input a number:\n");scanf("%d", &num);STU stu;for (int i = 0; i < num; i++){scanf("%d %s %f", &stu.id, stu.name, &stu.score);sprintf(buf, "INSERT INTO stu VALUES(%d, \"%s\", %f);", stu.id, stu.name, stu.score);if (sqlite3_exec(db, buf, NULL, NULL, &errmsg)){fprintf(stderr, "Failed to insert: %s\n", errmsg);return -1;}}if (sqlite3_exec(db, "SELECT * FROM stu;", select_cback, NULL, &errmsg)){fprintf(stderr, "Select failed: %s\n", errmsg);return -1;}printf("------------------------\n");if (sqlite3_exec(db, "SELECT name FROM stu WHERE score = 92;", select_cback, NULL, &errmsg)){fprintf(stderr, "Select failed: %s\n", errmsg);return -1;}sqlite3_close(db);return 0;
}

运行结果如下:
在这里插入图片描述

在这里插入图片描述

sqlite3_get_table(不回调查询)

int sqlite3_get_table(sqlite3 *db, const char *sql, char ***resultp, int *nrow, int *ncolumn, char **errmsg);功能:执行SQL操作
参数: 	db:			数据库句柄   sql:			SQL语句resultp:	用来指向sql执行结果的指针 (该参数为三级指针,指向二级指针,所以需定义二级指针变量) nrow:		该一级指针指向的内存空间中存储结果的行数,(一级指针指向变量地址),包括表头ncolumn:	该一级指针指向的内存空间中存储结果的列数 errmsg:	该二级指针指向的一级指针会存储错误信息首地址 
返回值:成功返回SQLITE_OK,失败返回错误码

在这里插入图片描述

// sqlite3.c#include <stdio.h>
#include <sqlite3.h>int num;
char buf[128] = {};
typedef struct{int id;char name[32];float score;
} STU; int main(int argc, char const *argv[])
{sqlite3 *db = NULL;if (sqlite3_open("/home/hq/MyFolders/sqlite3/testdb.db", &db)){fprintf(stderr, "Sqlite3_open failed: %s\n", sqlite3_errmsg(db));return -1;}char *errmsg = NULL;if (sqlite3_exec(db, "CREATE TABLE stu(id int primary key, name char, score float);",NULL, NULL, &errmsg)){fprintf(stderr, "Failed to create a table named \"stu\": %s\n", errmsg);}if (sqlite3_exec(db, "INSERT INTO stu VALUES(2023052201, \"Frank\", 95);", NULL, NULL, &errmsg)){fprintf(stderr, "Failed to insert: %s\n", errmsg);return -1;}printf("Please input a number:\n");scanf("%d", &num);STU stu;for (int i = 0; i < num; i++){scanf("%d %s %f", &stu.id, stu.name, &stu.score);sprintf(buf, "INSERT INTO stu VALUES(%d, \"%s\", %f);", stu.id, stu.name, stu.score);if (sqlite3_exec(db, buf, NULL, NULL, &errmsg)){fprintf(stderr, "Failed to insert: %s\n", errmsg);return -1;}}char **resultp;int nrow, ncolumn;if (sqlite3_get_table(db, "SELECT * FROM stu;", &resultp, &nrow, &ncolumn, &errmsg)){fprintf(stderr, "Failed to select: %s\n", errmsg);return -1;}printf("--------------------\n");for (int i = 0; i <= nrow; i++){     			// 要包含表头for (int j = 0; j < ncolumn; j++)printf("%-12s", resultp[i*ncolumn+j]);putchar(10);}sqlite3_close(db);return 0;
}

运行结果如下:
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

机器学习算法(1)——简单线性回归

一、说明 在在这篇文章中&#xff0c;我们将学习我们的第一个机器学习算法&#xff0c;称为简单线性回归。这是一个重要的算法&#xff0c;因为当您可能正在学习第一个神经网络&#xff08;称为人工神经网络&#xff09;时&#xff0c;在此算法中学习的技术也适用于深度学习。我…

阿里云经济型e实例云服务器怎么样?性能测评

阿里云服务器ECS推出经济型e系列&#xff0c;经济型e实例是阿里云面向个人开发者、学生、小微企业&#xff0c;在中小型网站建设、开发测试、轻量级应用等场景推出的全新入门级云服务器&#xff0c;CPU采用Intel Xeon Platinum架构处理器&#xff0c;支持1:1、1:2、1:4多种处理…

弄懂Rust编程中的Trait

1.定义 trait trait 定义了某个特定类型拥有可能与其他类型共享的功能。可以通过 trait 以一种抽象的方式定义共享的行为。可以使用 trait bounds 指定泛型是任何拥有特定行为的类型。 一个类型的行为由其可供调用的方法构成。如果可以对不同类型调用相同的方法的话&#xff…

微服务 Spring Cloud 8,开源RPC框架如何选型?

目录 一、开源RPC框架有哪些&#xff1f;1、跟语言平台绑定的开源RPC框架2、跨语言平台的开源RPC框架 二、跟语言平台绑定的开源RPC框架 -- Dubbo1、Dubbo的架构主要包含四个角色2、Dubbo的调用框架是如何实现的&#xff1f; 三、如何选择&#xff1f;四、跨语言平台的开源RPC框…

Java --- JVM之垃圾回收相关知识概念

目录 一、System.gc() 二、内存溢出与内存泄漏 2.1、内存溢出 2.2、内存泄漏 三、Stop the world 四、垃圾回收的并行与并发 4.1、并发 4.2、并行 4.3、并行 vs 并发 4.4、垃圾回收的并发与并行 五、安全点与安全区域 5.1、安全点 5.2、安全区域 六、引用 6.1…

QTableWidget——编辑单元格

文章目录 前言熟悉QTableWiget&#xff0c;通过实现单元格的合并、拆分、通过编辑界面实现表格内容及属性的配置、实现表格的粘贴复制功能熟悉QTableWiget的属性 一、[单元格的合并、拆分](https://blog.csdn.net/qq_15672897/article/details/134476530?spm1001.2014.3001.55…

c语言-操作符详解(含优先级与结合性)

文章目录 了解什么是操作数、操作符操作数&#xff1a;操作符 操作符详解&#xff1a;1.算术操作符&#xff1a; 、- 、* 、/ 、%2.移位操作符: << >>3.位操作符: & | ^4. 赋值操作符: 、 、 - 、 * 、 / 、% 、<< 、>> 、& 、| 、^5. 单⽬操…

MySQL用户与权限管理

快捷查看指令 ctrlf 进行搜索会直接定位到需要的知识点和命令讲解&#xff08;如有不正确的地方欢迎各位小伙伴在评论区提意见&#xff0c;博主会及时修改&#xff09; MySQL用户与权限管理 登录 #本地登录 mysql -uroot -p123456#远程登录 #客户端语法&#xff1a;mysql -…

Springboot_文件下载功能(前端后端)

遇到的问题&#xff1a; 文件下载后文件一直被破坏&#xff0c;无法正常打开文件名乱码&#xff0c;如图 刚开始一直在纠结&#xff0c;是不是后端没有写对&#xff0c;然后导致下载不能使用 后来搜索了一些资料&#xff0c;发现后端没什么问题 然后就开始找到其他项目对比…

Polygon Miden VM架构总览

1. 计算类型 Programs程序有2种类型&#xff1a; 1&#xff09;Circuit电路&#xff1a;即&#xff0c;程序即电路。将程序转换为电路。2&#xff09;Virtual machine虚拟机&#xff1a;即&#xff0c;程序为电路的输入。【Miden VM属于此类型】 2. 何为ZK virtual machine…

C++:继承

一、继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保 持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象 程序设计的层次结构&#xff0c…

万宾科技智能井盖传感器,预防城市道路安全

随着城市交通的不断发展和城市化进程的加速推进&#xff0c;城市道路安全问题日益凸显。市政井盖作为城市道路的一部分&#xff0c;承担着重要的交通安全保障职责。然而传统的市政井盖管理方式存在许多不足。针对这些问题政府需要采取适当的措施&#xff0c;补足传统管理方式的…

oracle “ORA-25153:临时表空间为空”

从生产上面备份出来了一个数据库&#xff0c;应用在使用时显示ORA-25153临时表空间为空的报错&#xff0c;原因一般是数据库迁移时&#xff0c;没有迁移完整造成的 解决方法 1.创建新的临时表空间temp2 create temporary tablespace temp2 tempfile DATA size 100M autoexten…

杭电oj 2064 汉诺塔III

#include <stdio.h>void main() {int n, i;long long sum[35] { 2,8,26 };for (i 3; i < 35; i)sum[i] 3 * sum[i - 1] 2;while (~scanf_s("%d", &n))printf("%lld\n", sum[n - 1]); }

python实现调和反距离空间插值法AIDW

1 简介 AIDW 主要是针对 IDW 的缺点进行了改进&#xff0c;考虑了样本点与预测点的位置&#xff0c;即方向和距离&#xff0c;具体见下图&#xff1a; 2 改进 IDW 公式&#xff1a; 从IDW算法可看出&#xff0c;插值点的估算值仅与插值样本距插值点的远近相关&#xff0c;并未…

@PropertySource适配通配符加载到Environment的一种方案

PropertySource可将配置文件加载到内存&#xff0c;时间有限说干的&#xff0c;PropertySource注解有4个参数&#xff0c;其中value表示要加载文件的路径&#xff0c;这个参数不支持通配符。还有一个参数PropertySourceFactory是加载配置文件的工厂&#xff0c;这两个参数配合使…

Sqli-lab教程-史上最全详解(1-22通关)

目录 Less-1 联合注入 Less-2 Less-3 Less-4 Less-5 报错注入/布尔盲注/时间盲注 Less-6 报错注入/布尔盲注/时间盲注 Less-7 文件导出 Less-8 布尔盲注/时间盲注 Less-9 时间盲注 Less-10 时间盲注 Less-11 post注入 Less-12 post注入 Less-13 post盲注 Less-14 post盲注 Less…

部署jekins遇到的问题

jdk问题 我用的jdk版本是21的结果版本太新了&#xff0c;启动jekins服务的时候总是报错最后在jekins的安装目录下面的jekinsErr.log查看日志发现是jdk问题最后换了一个17版本的就解决了。 unity和jekins jekins和Git源码管理 jekins和Git联动使用 我想让jekins每次打包的时…

【Java 进阶篇】Redis:打开缓存之门

介绍 Redis&#xff08;Remote Dictionary Server&#xff09;是一个高性能的键值对存储系统&#xff0c;被广泛用作缓存、消息中间件和数据库。它以其快速的读写能力、支持多种数据结构和丰富的功能而闻名。在这篇博客中&#xff0c;我们将深入了解Redis的概念、安装以及基本…

八、ffmpeg录制视频为yuv文件

前言 测试环境&#xff1a; ffmpeg的4.3.2自行编译版本windows环境qt5.12 图片的一些重要知识&#xff1a; RGB图片 位深度&#xff1a;每一个像素都会使用n个二进制位来存储颜色信息。每一个像素的颜色都是由红&#xff08;Red&#xff09;、绿&#xff08;Green&#xff0…