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.mzph.cn/news/161377.shtml

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

相关文章

Seaborn画图颜色和给定的RGB hex code不一致

使用以下代码画图&#xff1a; import seaborn as sns import matplotlib.pyplot as plt plt.figure(dpi150) x [A,B,C,D] y [164, 86, 126, 53] sns.barplot(xx, yy, color#3a923a) 得到的颜色如下图所示&#xff1a; 这是因为seaborn默认降低了颜色的饱和度&#xff0c;即…

UDP中connect的作用

udpclientNoConnect.c里边的内容如下&#xff1a; #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<arpa/inet.h> #include<sys/socket.h> #include <errno.h> #include <syslog.h…

基于 Flink CDC 打造企业级实时数据集成方案

本文整理自Flink数据通道的Flink负责人、Flink CDC开源社区的负责人、Apache Flink社区的PMC成员徐榜江在云栖大会开源大数据专场的分享。本篇内容主要分为四部分&#xff1a; CDC 数据实时集成的挑战Flink CDC 核心技术解读基于 Flink CDC 的企业级实时数据集成方案实时数据集…

独立版求职招聘平台小程序开发

小程序招聘系统开发 我们开发了一款高效、便捷的互联网招聘平台。在这里&#xff0c;可以轻松实现企业入驻、职位发布、在线求职、精准匹配职位和人才&#xff0c;以及参与招聘会等功能。目标是为求职者和企业搭建一个连接彼此的桥梁&#xff0c;帮助您更快地找到满意的工作&…

SpringMVC(五)SpringMVC的视图

SpringMVC中的视图是View接口&#xff0c;视图的作用渲染数据&#xff0c;将模型Model中的数据展示给用户 SpringMVC视图的种类很多&#xff0c;默认有转发视图(InternalResourceView)和重定向视图(RedirectView) 当工程引入jstl的依赖&#xff0c;转发视图会自动转换为JstlV…

深度学习 loss 是nan的可能原因

1 loss 损失值非常大&#xff0c;超过了浮点数的范围&#xff0c;所以表示为overflow 状态下的男。 解决办法&#xff1a; 减小学习率&#xff0c;观察loss值是不是还是nan 在将数据输入模型前&#xff0c;进行恰当的归一化 缩放 2 loss 的计算中存在除以0&#xff0c; log(0…

Java架构师软件架构开发

目录 1 基于架构的软件开发导论2 ABSD架构方法论3 ABSD方法论具体实现4 ABSD金融业案例5 基于特定领域的软件架构开发导论6 DSSA领域分析7 DSSA领域设计和实现8 DSSA国际电商平台架构案例9 架构思维方法论概述10 AT方法论和案例想学习架构师构建流程请跳转:Java架构师系统架构…

Unity UI设计 软件构造实验报告

实验1: 仿真系统的UI主界面设计 1.实验目的 &#xff08;1&#xff09;熟悉Unity中UI界面的设计与编写&#xff1b; &#xff08;2&#xff09;熟悉UI界面中场景转换,UI与场景内容相互关联的方式。 &#xff08;3&#xff09;熟悉Unity中MySQL数据库的操作 2.实验内容 新建…

生成式AI与大语言模型,东软已经准备就绪

伴随着ChatGPT的火爆全球&#xff0c;数以百计的大语言模型也争先恐后地加入了这一战局&#xff0c;掀起了一场轰轰烈烈的“百模大战”。毋庸置疑的是&#xff0c;继方兴未艾的人工智能普及大潮之后&#xff0c;生成式AI与大语言模型正在全球开启新一轮生产力革新的科技浪潮。 …

【C语言】深入理解指针(四)

&#x1f308;write in front :&#x1f50d;个人主页 &#xff1a; 啊森要自信的主页 ✏️真正相信奇迹的家伙&#xff0c;本身和奇迹一样了不起啊&#xff01; 欢迎大家关注&#x1f50d;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;>希望看完我的文章对你有小小的帮助&am…

帝国cms开发一个泛知识类的小程序的历程记录

#帝国cms小程序# 要开发一个泛知识类的小程序&#xff0c;要解决以下几个问题。 1。知识内容的分类。 2。知识内容的内容展示。 3。知识内容的价格设置。 4。用户体系&#xff0c;为简化用户的操作&#xff0c;在用户进行下载的时候&#xff0c;请用户输入手机号&#xff…

【HarmonyOS】API6上JS实现视频播放全屏播放时,会回到之前界面

【关键字】 API6 / 视频播放 / 全屏播放异常 【问题现象】 开发者在API6上用JS实现视频播放器点全屏播放后&#xff0c;不是全屏效果&#xff0c;实际效果是变成了横屏并返回到首页。 具体代码实现是参考video媒体组件指南。 【问题分析】 JS实现视频播放器有Codelab代码示…

DedeBIZ 管理系统 DedeV6 v6.2.6 社区版 免费授权版

DedeBIZ 系统&#xff1a;开源、安全、高效的 DedeV6 v6.2.6 社区版 DedeBIZ 系统是基于 PHP 7 版本开发的&#xff0c;具有强大的可扩展性&#xff0c;并且完全开放源代码。它采用现流行的 Go 语言设计开发&#xff0c;不仅拥有简单易用、灵活扩展的特性&#xff0c;还具备更…

Niushop 开源商城 v5.1.7:支持PC、手机、小程序和APP多端电商的源码

Niushop 系统是一款基于 ThinkPHP6 开发的电商系统&#xff0c;提供了丰富的功能和完善的商品机制。该系统支持普通商品和虚拟商品&#xff0c;并且针对虚拟商品还提供了完善的核销机制。同时&#xff0c;它也支持新时代的商业模式&#xff0c;如拼团、分销和多门店砍价等营销活…

Log4j

通过Log4j&#xff0c;我们可以控制日志信息输送到目的地是控制台、文件、GUI组件&#xff0c;甚至是套接口服务器、NT的事件记录器。我们可以控制每一条日志的输出格式。通过定义每一条日志信息的级别&#xff0c;能更加细致地控制日志的生成过程。 1 log4j、log4j2与SLF4J …

pikachu靶场Table pikachu.member doesn’t exist:解决

背景&#xff1a; 第一次搭建pikachu靶场&#xff0c;搭建好后访问index.php后&#xff0c;尝试练习&#xff0c;发现界面显示Table pikachu.member doesn t exist&#xff0c;后来找了很多教程&#xff0c;没有解决&#xff0c;后来发现是自己没有进行初始化&#xff0c;给大家…

VMware 系列:ESXI6.7升级7.0

ESXI6.7升级7.0 一、下载补丁二、上传文件三 启用Shell四、登录Shell后台五、删除不兼容驱动六、正常升级最近,将一台使用ESXI6.7的虚拟机升级到了7.0版本,下面记录一下自己的升级过程。 升级条件 首先确保硬件是否能升级到7.0版本,物理网卡驱动为e1000e不能升级,如果是ig…

不到十个例题带你拿下c++双指针算法(leetcode)

移动零问题 https://leetcode.cn/problems/move-zeroes/submissions/ 1.题目解析 必须在原数组进行修改&#xff0c;不可以新建一个数组 非零元素相对顺序不变 2.算法原理 【数组划分】【数组分块】 这一类题会给我们一个数组&#xff0c;让我们划分区间&#xff0c;比如…

【机器学习】Nonlinear Independent Component Analysis - Aapo Hyvärinen

Linear independent component analysis (ICA) x i ( k ) ∑ j 1 n a i j s j ( k ) for all i 1 … n , k 1 … K ( ) x_i(k) \sum_{j1}^{n} a_{ij}s_j(k) \quad \text{for all } i 1 \ldots n, k 1 \ldots K \tag{} xi​(k)j1∑n​aij​sj​(k)for all i1…n,k1…K()…

VUE语法-$refs和ref属性的使用

1、$refs和ref属性的使用 1、$refs:一个包含 DOM 元素和组件实例的对象&#xff0c;通过模板引用注册。 2、ref实际上获取元素的DOM节点 3、如果需要在Vue中操作DOM我们可以通过ref和$refs这两个来实现 总结:$refs可以获取被ref属性修饰的元素的相关信息。 1.1、$refs和re…