Linux---sqlite3数据库

一、数据库分类

1. 按数据关系分类
类型特点代表产品
关系型数据库- 使用 SQL(结构化查询语言)<br>- 数据以行列形式存储,支持事务和复杂查询MySQL、Oracle、SQLite
非关系型数据库- 无固定表结构(如键值对、文档、图)<br>- 高扩展性,适合非结构化数据MongoDB、Redis
2. 按功能规模分类
类型特点代表产品
大型数据库高并发、高可用性,支持企业级应用Oracle、DB2
中型数据库适用于中小型企业,跨平台支持MySQL、MSSQL
小型数据库轻量级,嵌入式或单机应用SQLite

注:以上分类中的代表产品均为关系型数据库。


二、核心概念与术语

1. 基础术语
  • DB(Database):存储数据的集合(如:用户表、订单表)。
  • DBMS(Database Management System):管理数据库的软件(如:MySQL、Oracle)。
  • MIS(Management Information System):集成数据库的管理信息系统(如:ERP系统)。
  • OA(Office Automation):基于数据库的办公自动化系统(如:审批流程系统)。
2. 数据库结构层次
数据库(DB)
├── 表(Table)
│   ├── 字段(Field,最小单位,如:姓名、年龄)
│   └── 记录(Record,由字段组成的一行数据)
└── 其他表...
  • 字段:表的列,定义数据类型(如:VARCHARINT)。
  • 记录:表的行,表示一条完整数据。

三、SQLite 数据库特点

1. 核心特性
特性说明
开源与轻量使用 C 语言开发,代码量约 1 万行,体积小于 10MB
无需安装绿色软件,直接集成到应用中
文件型数据库数据存储在单一文件中(如:data.db),便于迁移和备份
高兼容性支持跨平台(Windows/Linux/嵌入式设备)
容量限制单库最大支持 2TB 数据
2. 适用场景
  • 移动应用(如:Android/iOS 本地存储)
  • 嵌入式设备(如:智能硬件)
  • 小型项目原型开发

四、数据库文件操作

1. 创建/打开数据库
sqlite3 test.db    # 创建或打开 test.db 数据库文件

提示符变为 sqlite> 表示进入交互模式

2. 导入导出数据
# 导出数据库到 SQL 脚本
sqlite3 test.db .dump > backup.sql# 从 SQL 脚本导入数据
sqlite3 new.db < backup.sql


五、数据表操作 (DDL)

1. 创建表
-- 基础表结构
CREATE TABLE users (id INTEGER PRIMARY KEY,   -- 主键约束name TEXT NOT NULL,       -- 非空约束age INTEGER,reg_date DATETIME DEFAULT CURRENT_TIMESTAMP
);-- 带自增主键
CREATE TABLE user3 (id INTEGER PRIMARY KEY AUTOINCREMENT,name CHAR(20),age INT
);

SQLite 是弱类型数据库,字段类型仅为建议类型

2. 删除表
DROP TABLE users;  -- 慎用!会删除表结构和所有数据

六、数据操作 (DML)

1. 插入数据
-- 全字段插入
INSERT INTO users VALUES (1, '张三', 25, '2023-08-20 10:00:00');-- 指定字段插入
INSERT INTO users (name, age) VALUES ('李四', 30);-- 插入当前时间
INSERT INTO user1 VALUES (2, '王五', 28, datetime('now','+8 hours'));
2. 更新数据
-- 修改指定记录
UPDATE users SET age = 26 WHERE name = '张三';-- 多条件更新
UPDATE users SET age = 27 WHERE name = '李四' AND id = 2;
3. 删除数据
-- 清空表 (保留结构)
DELETE FROM users;-- 条件删除
DELETE FROM users WHERE age < 18;
DELETE FROM users WHERE id = 3 OR name = 'test';

七、数据查询 (DQL)

1. 基础查询
-- 查询所有字段
SELECT * FROM users;-- 查询指定字段
SELECT name, age FROM users;-- 条件查询
SELECT * FROM users WHERE age BETWEEN 20 AND 30;
2. 复杂查询
-- 排序查询
SELECT * FROM users ORDER BY age DESC;-- 模糊查询
SELECT * FROM users WHERE name LIKE '张%';-- 分页查询
SELECT * FROM users LIMIT 10 OFFSET 5;  -- 第6-15条记录

八、系统命令(以 . 开头)

命令功能
.tables显示所有表
.schema users查看 users 表结构
.dump users导出 users 表的 SQL 脚本
.mode column列式显示结果
.headers on显示列标题
.q退出 SQLite

九、数据类型与约束

1. 常用数据类型
类型描述
INTEGER整型 (支持自增 AUTOINCREMENT)
TEXT字符串
REAL浮点数
BLOB二进制数据
DATETIME日期时间 (需用函数处理)
2. 常用约束
约束说明
PRIMARY KEY主键 (唯一标识记录)
NOT NULL禁止空值
DEFAULT设置默认值
UNIQUE

值必须唯一

十、SQLite C 语言接口编程


(一)核心操作流程

graph TDA[打开数据库 sqlite3_open] --> B[执行操作]B --> C{操作类型}C -->|查询| D[使用 sqlite3_get_table]C -->|增删改| E[使用 sqlite3_exec]B --> F[关闭数据库 sqlite3_close]

(二)核心函数详解

1. 打开数据库 sqlite3_open
int sqlite3_open(const char *filename, sqlite3 **ppDb);
参数说明
filename数据库文件路径 (若不存在则自动创建)
ppDb输出参数,用于接收数据库句柄指针

返回值

  • SQLITE_OK (0):成功
  • 其他值:错误代码 (需用 sqlite3_errmsg() 获取错误信息)

示例

sqlite3 *db = NULL;
int rc = sqlite3_open("test.db", &db);
if (rc != SQLITE_OK) {fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));exit(1);
}

2. 执行查询操作 sqlite3_get_table
int sqlite3_get_table(sqlite3 *db,          // 数据库句柄const char *zSql,     // SQL 语句char ***pazResult,    // 结果集指针int *pnRow,           // 返回行数int *pnColumn,        // 返回列数char **pzErrmsg       // 错误信息指针
);

结果集结构

// 假设查询返回 2 列 (name, age) 和 3 行数据
pazResult[0] = "name"
pazResult[1] = "age"
pazResult[2] = "Alice"
pazResult[3] = "25"
pazResult[4] = "Bob"
pazResult[5] = "30"

示例

char **result;
int rows, cols;
char *errmsg = NULL;rc = sqlite3_get_table(db, "SELECT name, age FROM users", &result, &rows, &cols, &errmsg);if (rc == SQLITE_OK) {// 处理结果集for (int i = 0; i <= rows; i++) { // 第0行是列名for (int j = 0; j < cols; j++) {printf("%s\t", result[i*cols + j]);}printf("\n");}sqlite3_free_table(result); // 必须释放内存!
} else {fprintf(stderr, "SQL错误: %s\n", errmsg);sqlite3_free(errmsg);
}

3. 执行非查询操作 sqlite3_exec
int sqlite3_exec(sqlite3 *db,               // 数据库句柄const char *sql,           // SQL 语句int (*callback)(void*,int,char**,char**), // 回调函数void *arg,                 // 回调函数参数char **errmsg              // 错误信息指针
);

回调函数原型

int callback(void *arg,        // 用户传递的参数int num_cols,     // 结果列数char **col_values, // 当前行的列值char **col_names   // 列名数组
);

示例

// 插入数据
rc = sqlite3_exec(db, "INSERT INTO users VALUES(3, 'Charlie', 28)", NULL, NULL, &errmsg);// 带回调的查询
int print_callback(void *arg, int cols, char **values, char **names) {for (int i = 0; i < cols; i++) {printf("%s: %s\t", names[i], values[i]);}printf("\n");return 0; // 必须返回0
}rc = sqlite3_exec(db, "SELECT * FROM users", print_callback, NULL, &errmsg);

4. 关闭数据库 sqlite3_close
int sqlite3_close(sqlite3 *db);

注意事项

  • 关闭前必须完成所有事务
  • 返回 SQLITE_BUSY 表示仍有未完成的查询

(三)内存管理与错误处理

1. 释放资源
sqlite3_free_table(char **result);  // 释放 sqlite3_get_table 的结果
sqlite3_free(void *ptr);           // 释放错误信息内存
2. 错误信息获取
const char *errmsg = sqlite3_errmsg(db);
printf("错误信息: %s\n", errmsg);

实例:

程序用于将一个文本格式的字典文件(每行包含一个单词及其解释)转换为 SQLite 数据库格式,便于后续的查询和管理。

#include <stdio.h>
#include <sqlite3.h>
#include <string.h>
#include <unistd.h>// 主函数,参数为字典文本文件和目标数据库文件
int main(int argc, const char *argv[])
{// 检查命令行参数是否正确if (argc != 3){printf("Usage: %s <*.txt> <*.db>\n", argv[0]);return -1;}// 打开字典文本文件FILE *fp = fopen(argv[1], "r");if (fp == NULL){perror("fopen fail");return -1;}// 初始化 SQLite 数据库sqlite3 *db;int ret = sqlite3_open("dict.db", &db); // 打开或创建数据库文件if (ret != SQLITE_OK){printf("sqlite3_open fail:%s\n", sqlite3_errmsg(db));return -1;}printf("sqlite3_open success\n");// 创建字典表char sql[1024] = {0};printf("Please create table:");fgets(sql, sizeof(sql), stdin); // 从标准输入读取创建表的 SQL 语句sql[strlen(sql) - 1] = '\0';     // 去除换行符char *errmsg = NULL;ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg); // 执行 SQL 语句if (ret != SQLITE_OK){printf("sqlite3_exec fail : %s \n", errmsg);return -1;}// 读取字典文本文件并插入数据库char buf[1024] = {0};int i = 0;while (1){char *pret = fgets(buf, sizeof(buf), fp); // 逐行读取文本文件if (pret == NULL){break; // 读取完成}// 解析单词和解释char *pword = strtok(buf, " ");    // 提取单词char *pexplain = strtok(NULL, "\r"); // 提取解释printf("pword    = %s\n", pword);printf("pexplain = %s\n", pexplain);// 构造插入 SQL 语句sprintf(sql, "insert into dict values (%d,\"%s\",\"%s\");", i, pword, pexplain);ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg); // 执行插入操作if (ret != SQLITE_OK){printf("sqlite3_exec fail : %s \n", errmsg);return -1;}++i;// sleep(1); // 如果需要控制插入速度,可以取消注释}// 关闭文件和数据库连接fclose(fp);sqlite3_close(db);return 0;
}

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

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

相关文章

docker入门篇

使用docker可以很快部署相同的环境,这也是最快的环境构建,接下来就主要对docker中的基础内容进行讲解.Docker 是一个用于开发、交付和运行应用程序的开源平台&#xff0c;它可以让开发者将应用程序及其依赖打包到一个容器中&#xff0c;然后在任何环境中运行这个容器&#xff0…

Learning vtkjs之ContourLoopExtraction

过滤器 等高线轮廓提取 介绍 这个过滤器可以获取一个cut的相交的循环的线&#xff0c;目前这个案例cut是一个平面&#xff0c;应该是可以支持更多隐式公式 效果 可以设置这个平面的原点Origin 法线方向Normal&#xff0c;然后就可以求交了 核心代码 需要实现这个代码主要…

如何高效解决 Java 内存泄漏问题方法论

目录 一、系统化的诊断与优化方法论 二、获取内存快照&#xff1a;内存泄漏的第一步 &#xff08;一&#xff09;自动生成 Heap Dump &#xff08;二&#xff09;手动生成 Heap Dump 三、导入分析工具&#xff1a;MAT 和 JProfiler &#xff08;一&#xff09;MAT (Memor…

新手村:数据预处理-异常值检测方法

机器学习中异常值检测方法 一、前置条件 知识领域要求编程基础Python基础&#xff08;变量、循环、函数&#xff09;、Jupyter Notebook或PyCharm使用。统计学基础理解均值、中位数、标准差、四分位数、正态分布、Z-score等概念。机器学习基础熟悉监督/无监督学习、分类、聚类…

大模型-提示词调优

什么是提示词 提示词&#xff08;Prompt&#xff09;在大模型应用中扮演着关键角色&#xff0c;它是用户输入给模型的一段文本指令 。简单来说&#xff0c;就是我们向大模型提出问题、请求或描述任务时所使用的文字内容。例如&#xff0c;当我们想让模型写一篇关于春天的散文&a…

VS2022输入 scanf 报错解决方法

1.第一种解决办法&#xff08;不推荐&#xff09; •将 scanf 替换为 scanf_s •scanf_s 是VS提供的一个函数&#xff0c;scanf_s函数的使用和scanf是有区别的 •scanf_s 是VS提供的一个函数&#xff0c;其他的编译器可能不认识这个函数&#xff0c;那么我们所写的代码就存在跨…

鸿蒙开发-一多开发之媒体查询功能

在HarmonyOS中&#xff0c;使用ArkTS语法实现响应式布局的媒体查询是一个强大的功能&#xff0c;它允许开发者根据不同的设备特征&#xff08;如屏幕尺寸、屏幕方向等&#xff09;动态地调整UI布局和样式。以下是一个使用媒体查询实现响应式布局的实例&#xff1a; 1. 导入必要…

火语言RPA--列表项内容获取

【组件功能】&#xff1a;获取列表中某项数据内容 配置预览 配置说明 获取 获取数据方式 首项&#xff1a;列表第一条数据 末项&#xff1a;列表最后一条数据 随机项&#xff1a;随机获取列表中一条数据 指定索引项&#xff1a;根据索引获取列表对象中数据。 索引项目位置 …

基于Python+Flask+MySQL+HTML的爬取豆瓣电影top-250数据并进行可视化的数据可视化平台

FlaskMySQLHTML 项目采用前后端分离技术&#xff0c;包含完整的前端&#xff0c;以flask作为后端 Pyecharts、jieba进行前端图表展示 通过MySQL收集格列数据 通过Pyecharts制作数据图表 这是博主b站发布的详细讲解&#xff0c;感兴趣的可以去观看&#xff1a;【Python爬虫可…

解锁MySQL 8.0.14源码调试:Mac 11.6+CLion 2024.3.4实战指南

文章目录 解锁MySQL 8.0.41源码调试&#xff1a;Mac 11.6CLion 2024.3.4实战指南前期准备环境搭建详细步骤安装 CLion安装 CMake 3.30.5准备 MySQL 8.0.14 源码配置 CMake 选项构建 MySQL 项目 调试环境配置与验证配置 LLDB 调试器启动调试验证调试环境 总结与拓展 解锁MySQL 8…

81.HarmonyOS NEXT 状态管理与响应式编程:@Observed深度解析

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; HarmonyOS NEXT 状态管理与响应式编程&#xff1a;Observed深度解析 文章目录 HarmonyOS NEXT 状态管理与响应式编程&#xff1a;Observed深度解析…

【快速入门】MyBatis

一.基础操作 1.准备工作 1&#xff09;引入依赖 一个是mysql驱动包&#xff0c;一个是mybatis的依赖包&#xff1a; <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><vers…

RabbitMQ可靠性进制

文章目录 1.生产者可靠性生产者重连生产者确认小结 2. MQ的可靠性数据持久化LazyQueue小结 3. 消费者的可靠性消费者确认机制消费者失败处理方案业务幂等性唯一消息ID业务判断 兜底方案业务判断 兜底方案 1.生产者可靠性 生产者重连 在某些场景下由于网络波动&#xff0c;可能…

【专项测试】限流测试

简介 限流的目的是防止恶意请求、恶意攻击&#xff0c;或者防止流量超出系统峰值时保护系统免受灭顶之灾。 限流的具体做法是是通过对并发访问/请求进行限速或者对一个时间窗口的请求进行限速在保护系统&#xff0c;一旦达到限制速率则可以拒绝服务&#xff08;定向到错误页&a…

Qt-D指针与Q指针的设计哲学

文章目录 前言PIMLP与二进制兼容性D指针Q指针优化d指针继承Q_D和Q_Q 前言 在探索Qt源码的过程中会看到类的成员有一个d指针&#xff0c;d指针类型是一个private的类&#xff0c;这种设计模式称为PIMPL&#xff08;pointer to implementation&#xff09;&#xff0c;本文根据Q…

ctf web入门知识合集

文章目录 01做题思路02信息泄露及利用robots.txt.git文件泄露dirsearch ctfshow做题记录信息搜集web1web2web3web4web5web6web7web8SVN泄露与 Git泄露的区别web9web10 php的基础概念php的基础语法1. PHP 基本语法结构2. PHP 变量3.输出数据4.数组5.超全局变量6.文件操作 php的命…

LangChain 工作流编排

文章目录 LCEL流式调用案例invoke的异步调用异步流中的事件 LCEL LangChain Expression Language&#xff0c;是一种强大的工作流编排工具&#xff0c;可以从基本组件构建复杂的任务链&#xff08;Chain&#xff09;&#xff0c;有如下亮点&#xff1a; 流式支持&#xff1b;…

PyTorch 深度学习实战(14):Deep Deterministic Policy Gradient (DDPG) 算法

在上一篇文章中&#xff0c;我们介绍了 Proximal Policy Optimization (PPO) 算法&#xff0c;并使用它解决了 CartPole 问题。本文将深入探讨 Deep Deterministic Policy Gradient (DDPG) 算法&#xff0c;这是一种用于连续动作空间的强化学习算法。我们将使用 PyTorch 实现 D…

3.14-1列表

列表 一.列表的介绍和定义 1 .列表 类型: <class list> 2.符号:[] 3.定义列表: 方式1:[] 通过[] 来定义 list[1,2,3,4,6] print(type(list)) #<class list> 方式2: 通过list 转换 str2"12345" print(type(str2)) #<class str> list2lis…

Java集合 - HashMap

HashMap 是 Java 集合框架中的一个重要类&#xff0c;位于 java.util 包中。它实现了 Map 接口&#xff0c;基于哈希表的数据结构来存储键值对&#xff08;key-value pairs&#xff09;。HashMap 允许使用 null 作为键和值&#xff0c;并且是非同步的&#xff08;非线程安全的&…