SQLite3

news2025/1/11 14:12:46

数据库简介

常用的数据库

大型数据库: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:			传递给回调函数的第一个参数;  
							- 类似线程函数传参,需强转 - 不传参可以填 NULL
    char **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.coloradmin.cn/o/1240858.html

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

相关文章

spark shuffle 剖析

ShuffleExchangeExec private lazy val writeMetrics SQLShuffleWriteMetricsReporter.createShuffleWriteMetrics(sparkContext)private[sql] lazy val readMetrics SQLShuffleReadMetricsReporter.createShuffleReadMetrics(sparkContext)用在了两个地方&#xff0c;承接的是…

HarmonyOS ArkTS 应用添加弹窗(八)

概述 在我们日常使用应用的时候&#xff0c;可能会进行一些敏感的操作&#xff0c;比如删除联系人&#xff0c;这时候我们给应用添加弹窗来提示用户是否需要执行该操作&#xff0c;如下图所示&#xff1a; 弹窗是一种模态窗口&#xff0c;通常用来展示用户当前需要的或用户必须…

基于金枪鱼群算法优化概率神经网络PNN的分类预测 - 附代码

基于金枪鱼群算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于金枪鱼群算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于金枪鱼群优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

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

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

通过AX6000路由器,实现外部访问内网的任意主机

概述 这里遇到一个场景,就是需要外部的人员,访问我内网的一台设备,进行内外部的设备联调。 这也是实际环境中,很常见的一种场景。 之前的做法是子设备上运行edge节点,可以直接访问。 但有的设备无法运行edge节点,那么可以参考一下这个方案来实现。 此方案可以摒弃了…

OpenAI再次与Sam Altman谈判;ChatGPT Voice正式上线

11月22日&#xff0c;金融时报消息&#xff0c;OpenAI迫于超过700名员工联名信的压力&#xff0c;再次启动了与Sam Altman的谈判&#xff0c;希望他回归董事会。 在Sam确定加入微软后&#xff0c;OpenAI超700名员工签署了一封联名信&#xff0c;要求Sam和Greg Brockman&#x…

从0开始学习JavaScript--JavaScript迭代器

JavaScript迭代器&#xff08;Iterator&#xff09;是一种强大的编程工具&#xff0c;它提供了一种统一的方式来遍历不同数据结构中的元素。本文将深入探讨JavaScript迭代器的基本概念、用法&#xff0c;并通过丰富的示例代码展示其在实际应用中的灵活性和强大功能。 迭代器的…

本地训练,开箱可用,Bert-VITS2 V2.0.2版本本地基于现有数据集训练(原神刻晴)

按照固有思维方式&#xff0c;深度学习的训练环节应该在云端&#xff0c;毕竟本地硬件条件有限。但事实上&#xff0c;在语音识别和自然语言处理层面&#xff0c;即使相对较少的数据量也可以训练出高性能的模型&#xff0c;对于预算有限的同学们来说&#xff0c;也没必要花冤枉…

如何用惯性动作捕捉系统,快速创建数字人三维动画?

在动画制作领域&#xff0c;惯性动作捕捉技术已经逐渐成为一种重要的制作手段。通过动捕设备能够将动捕演员真实的动作转化为数字数据&#xff0c;然后在动画中再现这些动作。为了创造出逼真、流畅的数字人动画&#xff0c;惯性动作捕捉系统成为了一大工具。 根据采集方式的不…

【计算机网络笔记】路由算法之层次路由

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

2023年亚太地区数学建模大赛 问题B

玻璃温室中的微气候法规 温室作物的产量受到各种气候因素的影响&#xff0c;包括温度、湿度和风速[1]。其中&#xff0c;适宜的温度和风速是植物生长[2]的关键。为了调节玻璃温室内的温度、风速等气候因素&#xff0c;温室的设计通常采用带有温室风扇的通风系统&#xff0c;如…

《数学之美》第三版的读书笔记一、主要是马尔可夫假设、隐马尔可夫模型、图论深度/广度、PageRank相关算法、TF-IDF词频算法

1、马尔可夫假设 从19世纪到20世纪初,俄国有个数学家叫马尔可夫他提出了一种方法,假设任意一个词出现的概率只同它前面的词有关。这种假设在数学上称为马尔可夫假设。 2、二元组的相对频度 利用条件概率的公式,某个句子出现的概率等于每一个词出现的条件概率相乘,于是可展…

2023亚太杯数学建模B题思路 - 玻璃温室中的微气候法规

# 1 赛题 问题B 玻璃温室中的微气候法规 温室作物的产量受到各种气候因素的影响&#xff0c;包括温度、湿度和风速[1]。其中&#xff0c;适 宜的温度和风速是植物生长[2]的关键。为了调节玻璃温室内的温度、风速等气候因素 , 温室的设计通常采用带有温室风扇的通风系统&#x…

minio集群部署(k8s内)

一、前言 minio的部署有几种方式&#xff0c;分别是单节点单磁盘&#xff0c;单节点多磁盘&#xff0c;多节点多磁盘三种方式&#xff0c;本次部署使用多节点多磁盘的方式进行部署&#xff0c;minio集群多节点部署最低要求需要4个节点&#xff0c;集群扩容时也是要求扩容的节点…

GPIO模式详解:推挽/开漏/浮空/上拉/下拉/施密特(迟滞)输入

GPIO(General Purpose Input Output)可用于执行数字输入或输出功能。典型的应用包括从/向模拟或数字传感器/设备读写数值、驱动LED、为I2C通信驱动时钟、生成外部组件的触发、发出中断等。 文章目录 1 GPIO简介2 输出模式2.1 推挽输出2.2 开漏输出 3 输入模式3.1 高阻态(浮空)、…

2023亚太杯数学建模B题思路分析 - 玻璃温室中的微气候法规

1 赛题 问题B 玻璃温室中的微气候法规 温室作物的产量受到各种气候因素的影响&#xff0c;包括温度、湿度和风速[1]。其中&#xff0c;适 宜的温度和风速是植物生长[2]的关键。为了调节玻璃温室内的温度、风速等气候因素 , 温室的设计通常采用带有温室风扇的通风系统&#xf…

Pycharm的程序调试

有如下代码需要进行调试&#xff1a; i 1 while i < 10:print(i)步骤一&#xff1a;设置断点 步骤二&#xff1a;进入调试视图 方式1&#xff1a;右键单击编辑区&#xff1a;点击’Debug模块名’ ​ 方式2&#xff1a;ShiftF9 ​ 方式3&#xff1a;单机工具栏上的调试按钮…

Matlab进阶绘图第33期—双曲面图

在《Matlab论文插图绘制模板第56期—曲面图&#xff08;Surf&#xff09;》中&#xff0c;我分享过曲面图的绘制模板。 然而&#xff0c;有的时候&#xff0c;需要在一张图上绘制两个及以上的曲面图&#xff0c;且每个曲面图使用不同的配色方案。 在Matlab中&#xff0c;一张…

everything排除目录

everything默认搜索所有文件&#xff0c;自己把没啥必要的目录都屏蔽掉&#xff0c;记录如下

K8s实战RestartPoliy策略

一、默认策略为Always cmd.yaml apiVersion: v1 kind: Pod metadata:name: myapp-pod labels:app: myapp spec: containers:- name: myapp-container image: busyboxcommand: [sh, -c, echo OK!&& sleep 60]首先我们根据这个yaml创建一个测试的pod 执行命令 kubec…