SQLite3 数据库学习(一):数据库和 SQLite 基础
参考引用
- SQL 必知必会
- SQLite 权威指南(第二版)
- 关系型数据库概述
1. 数据库基础
1.1 什么是数据库
-
数据库(database):保存有组织的数据的容器(通常是一个文件或一组文件)
- 可以将其想象为一个文件柜,此文件柜是一个存放数据的物理位置,不管数据是什么以及如何组织的
-
数据库软件应称为 DBMS(数据库管理系统),数据库是通过 DBMS 创建和操纵的容器
- 在很大程度上说,数据库究竟是文件还是别的什么东西并不重要,因为你并不直接访问数据库,而是使用 DBMS,它替你访问数据库
1.2 为什么需要数据库?
因为应用程序需要保存用户的数据,比如 Word 需要把用户文档保存起来,以便下次继续编辑或者拷贝到另一台电脑。要保存用户的数据,一个最简单的方法是把用户数据写入文件
-
但是,随着应用程序的功能越来越复杂,数据量越来越大,如何管理这些数据就成了大问题
- 读写文件并解析出数据需要大量重复代码
- 从成千上万的数据中快速查询出指定数据需要复杂的逻辑
如果每个应用程序都各自写自己的读写数据的代码,一方面效率低,容易出错,另一方面,每个应用程序访问数据的接口都不相同,数据难以复用
-
所以,数据库作为一种专门管理数据的软件就出现了。应用程序不需要自己管理数据,而是通过数据库软件提供的接口来读写数据。至于数据本身如何存储到文件,那是数据库软件的事情,应用程序自己并不关心
1.3 基本概念
1.3.1 表
-
表(table):某种特定类型数据的结构化清单
- 在你将资料放入自己的文件柜时,并不是随便将它们扔进某个抽屉就完事了,而是在文件柜中创建文件,然后将相关的资料放入特定的文件中
- 在数据库领域中,这种文件称为表。表可以保存顾客清单、产品目录,或者其他信息清单
- 存储在表中的数据是同一种类型的数据或一个清单
- 不应该将顾客的清单与订单的清单存储在同一个数据库表中,因为这样做将使以后的检索和访问很困难,应该创建两个表,每个清单一个表
-
表名
- 数据库中的每个表都有一个名字,用来标识自己
- 此名字是唯一的,这表示数据库中没有其他表具有相同的名字,表名的唯一性取决于多个因素,如数据库名和表名等的结合,这表示在不同的数据库中可以使用相同的表名
-
模式(schema):关于数据库和表的布局及特性的信息
- 这些特性定义了数据在表中如何存储,如:可以存储什么样的数据,数据如何分解,各部分信息如何命名等
1.3.2 列和数据类型
-
列(column):表中的一个字段,所有表都是由一个或多个列组成的
- 理解列的最好办法是将数据库表想象为一个网格,网格中每一列存储着一条特定的信息
- 例如,在顾客表中,一个列存储着顾客编号,另一个列存储着顾客名
-
数据类型(datatype):所容许的数据的类型
- 每个表列都有相应的数据类型,它限制(或容许)该列中存储的数据种类
- 例如,可以防止在数值字段中录入字符值
- 数据类型还可帮助正确地排序数据,并在优化磁盘使用方面起到重要作用
- 每个表列都有相应的数据类型,它限制(或容许)该列中存储的数据种类
1.3.3 行
- 行(row):表中的一个记录
- 表中的数据是按行存储的,所保存的每个记录存储在自己的行内
- 例如,顾客表可以每行存储一个顾客,表中的行数为记录的总数
1.3.4 键
1、主键
- 在关系型数据库中,一张表中的每一行数据被称为一条记录
- 一条记录就是由多个字段组成的。例如,下表 students 的两行记录

-
主键(primary key):一列(或一组列),其值能够唯一区分表中每个行
- 能够通过某个字段唯一区分出不同的记录,这个字段被称为主键
- 例如,假设上表把 name 字段作为主键,那么通过名字小明或小红就能唯一确定一条记录
-
业务场景中选取主键的一个基本原则是:不使用任何业务相关的字段作为主键。作为主键最好是完全业务无关的字段,一般把这个字段命名为 id,常见的可作为 id 字段的类型有:
- 自增整数类型:数据库会在插入数据时自动为每一条记录分配一个自增整数,这样就完全不用担心主键重复,也不用自己预先生成主键
- 全局唯一 GUID 类型:使用一种全局唯一的字符串作为主键,类似8f55d96b-8acc-4636-8cb8-76bf8abc2f57。GUID 算法通过网卡 MAC 地址、时间戳和随机数保证任意计算机在任意时间生成的字符串都是不同的
- 每个行都必须具有一个主键值(主键列不允许 NULL 值)
通常,自增类型的主键就能满足需求。上表 students 中定义的主键也是 BIGINT NOT NULL AUTO_INCREMENT 类型
2、联合主键

-
关系型数据库还允许通过多个字段唯一标识记录,即两个或更多的字段都设置为主键,这种主键被称为联合主键
- 对于联合主键,允许一列有重复,只要不是所有主键列都重复即可
-
如果把上表的 id_num 和 id_type 这两列作为联合主键,那么上面的 3 条记录都是允许的,因为没有两列主键组合起来是相同的
- 没有必要的情况下,尽量不使用联合主键,因为它给关系表带来了复杂度的上升
主键的最好习惯
- 不更新主键列中的值
- 不重用主键列的值
- 不在主键列中使用可能会更改的值
3、外键
一对多
- 当用主键唯一标识记录时,就可以在 students 表中确定任意一个学生的记录

- 还可以在 classes 表中确定任意一个班级记录

- 但是如何确定 students 表的一条记录,例如,id=1 的小明,属于哪个班级呢?
- 由于一个班级可以有多个学生,在关系模型中,这两个表的关系可以称为 “一对多”,即一个 classes 的记录可以对应多个 students 表的记录
- 为了表达这种一对多的关系,需要在 students 表中加入一列 class_id,让它的值与 classes 表的某条记录相对应
- 在 students 表中,通过 class_id 的字段,可以把数据与另一张表关联起来,这种列称为外键 (下图红框列)

-
这样,就可以根据 class_id 这个列直接定位出一个 students 表的记录应该对应到 classes 的哪条记录
- 小明的 class_id 是 1,因此,对应的 classes 表的记录是 id=1 的一班
- 小红的 class_id 是 1,因此,对应的 classes 表的记录是 id=1 的一班
- 小白的 class_id 是 2,因此,对应的 classes 表的记录是 id=2 的二班
-
外键并不是通过列名实现的,而是通过定义外键约束实现的
ALTER TABLE students ADD CONSTRAINT fk_class_id // 外键约束名称,可随意指定 FOREIGN KEY (class_id) // 指定 class_id 作为外键 REFERENCES classes (id) // 指定这个外键将关联到 classes 表的 id 列(即 classes 表的主键) DROP FOREIGN KEY fk_class_id // 删除外键约束 fk_class_id,删除外键约束并没有删除外键这一列
多对多
- 通过一个表的外键关联到另一个表,可以定义出一对多关系。有些时候,还需要定义 “多对多” 关系。例如,一个老师可以对应多个班级,一个班级也可以对应多个老师,因此,班级表和老师表存在多对多关系
- 多对多关系是通过两个一对多关系实现的,即通过一个中间表,关联两个一对多关系,就形成了多对多关系



-
通过中间表 teacher_class 可知 teachers 到 classes 的关系
- id=1 的张老师对应 id=1,2 的一班和二班
- id=2 的王老师对应 id=1,2 的一班和二班
- id=3 的李老师对应 id=1 的一班
- id=4 的赵老师对应 id=2 的二班
-
同理可知 classes 到 teachers 的关系
- id=1 的一班对应 id=1,2,3 的张老师、王老师和李老师
- id=2 的二班对应 id=1,2,4 的张老师、王老师和赵老师
一对一
- 一个表的记录对应到另一个表的唯一一个记录
- 例如,students 表的每个学生可以有自己的联系方式,如果把联系方式存入另一个表 contacts,就可以得到一个 “一对一” 关系
- 实际上,一对一关系准确地说,是 contacts 表一对一对应 students 表

- 还有一些应用会把一个大表拆成两个一对一的表,目的是把经常读取和不经常读取的字段分开,以获得更高的性能
- 例如,把一个大的用户表拆分为用户基本信息表 user_info 和用户详细信息表 user_profiles,大部分时候,只需要查询 user_info 表,并不需要查询 user_profiles 表,这样就提高了查询速度
1.3.5 索引
-
在关系数据库中,如果有上万甚至上亿条记录,在查找记录的时候,想要获得非常快的速度,就需要使用索引
- 索引是关系数据库中对某一列或多个列的值进行预排序的数据结构
- 通过使用索引,可以让数据库系统不必扫描整个表,而是直接定位到符合条件的记录,这就大大加快了查询速度
-
例如,对于 students 表,如果要经常根据 score 列进行查询,就可以对 score 列创建索引
ALTER TABLE students ADD INDEX idx_score (score); //ADD INDEX idx_name_score (name, score); // 索引名称是任意的,索引如果有多列,可以在括号里依次写上

唯一索引
- 在设计关系数据表的时候,看上去唯一的列,例如身份证号、邮箱地址等,因为他们具有业务含义,因此不宜作为主键。但是,这些列根据业务要求,又具有唯一性约束:即不能出现两条记录存储了同一个身份证号。这个时候,就可以给该列添加一个唯一索引。例如,假设 students 表的 name 不能重复
ALTER TABLE students ADD UNIQUE INDEX uni_name (name); // 通过 UNIQUE 关键字就添加了一个唯一索引
1.4 数据模型
1.4.1 层次模型
- 层次模型就是以 “上下级” 的层次关系来组织数据的一种方式,层次模型的数据结构看起来就像一颗树

1.4.2 网状模型
- 网状模型把每个数据节点和其他很多节点都连接起来,它的数据结构看起来就像很多城市之间的路网

1.4.3 关系模型
- 关系模型把数据看作是一个二维表格,任何数据都可以通过行号 + 列号来唯一确定,它的数据模型看起来就是一个 Excel 表
- 基于关系模型的关系型数据库成为主流,因为相比层次模型和网状模型,关系模型理解和使用起来最简单

- 现有主流的关系型数据库
- 商用数据库,例如:Oracle,SQL Server,DB2 等
- 开源数据库,例如:MySQL,PostgreSQL 等
- 桌面数据库,以微软 Access 为代表,适合桌面应用程序使用
- 嵌入式数据库,以 SQLite 为代表,适合手机应用和桌面程序
1.5 数据类型
- 通常来说,BIGINT 能满足整数存储的需求,VARCHAR(N) 能满足字符串存储的需求,这两种类型是使用最广泛的
- 下表中列举了最常用的数据类型,各数据库厂商还会支持特定的数据类型,例如 JSON

- 下表中列举了最常用的数据类型,各数据库厂商还会支持特定的数据类型,例如 JSON
2. SQL 介绍
-
SQL(发音为字母 S-Q-L 或 sequel)是结构化查询语言(Structured Query Language)的缩写
- SQL 是一种专门用来与数据库通信的语言
-
SQL 的优点
- SQL不是某个特定数据库供应商专有的语言
- 几乎所有重要的 DBMS 都支持 SQL
- SQL 简单易学
- 它的语句全都是由描述性很强的英语单词组成,而且这些单词的数目不多
- SQL 是一种强有力的语言,灵活使用其语言元素,可以进行非常复杂和高级的数据库操作
- SQL不是某个特定数据库供应商专有的语言
-
SQL 语言定义 3 种操作数据库的能力
- DDL:Data Definition Language
- DDL 允许用户定义数据,也就是创建表、删除表、修改表结构这些操作
- 通常,DDL 由数据库管理员执行
- DML:Data Manipulation Language
- DML 为用户提供添加、删除、更新数据的能力,这些是应用程序对数据库的日常操作
- DQL:Data Query Language
- DQL 允许用户查询数据,这也是通常最频繁的数据库日常操作
- DDL:Data Definition Language
任意两个 DBMS(数据库管理系统)实现的 SQL 都不完全相同,无法完全直接移植
3. SQLite 介绍
3.1 简介
-
SQLite 是一款开源的、嵌入式关系型数据库
- 它没有独立运行的进程,它与所服务的应用程序在应用程序进程空间内共生共存
- 它的代码与应用程序代码也是在一起的,或者说嵌入其中作为托管它的程序的一部分
- 程序只需要做自己的事,管理自己的数据,不需要详细了解 SQLite 是如何工作的
-
数据库服务器和客户端运行在同一个进程中的好处是:不需要网络配置或管理
- 不用担心防火墙或者地址解析,不用浪费时间管理复杂的授权和权限
- 可以减少网络调用相关的消耗,简化数据库管理,使程序更容易部署
-
从下图可知,一个 Perl 脚本、一个标准 C/C++ 程序和一个 Apache 托管的 PHP 脚本都使用 SQLite
- 这三种都有嵌入在它们进程空间的 SQLite,这样做不仅可以使这些进程运行各自的代码,也可以成为独立的数据库服务器
- 此外,尽管每个进程中都有独立的数据库服务器,但它们依然可以操作同一个数据库文件,因为 SQLite 利用操作系统功能来完成数据的同步和加锁

3.2 体系结构

-
接口
- 接口处于栈的顶端,由 SQLite C API 组成
- 程序、脚本语言还有与 SQLite 交互的库文件最终都是通过它与 SQLite 交互的
-
编译器
- 编译过程从词法分析器 (Tokenizer) 和语法分析器 (Parser) 开始。它们协同处理文本形式的结构化查询语句 (Structured Query Language,SQL),分析其语法有效性,然后转化为底层能更方便处理的层次化数据结构
- SQLite 词法分析器是手动编码实现,它的语法分析器是由 SQLite 特定的语法分析生成器 Lemon 产生
-
虚拟机
- 架构栈的中心部分是虚拟机,也叫做虚拟数据库引 (Virtual DataBase Engine,VDEB)
- VDBE 是 SQLite 的核心,它之前的所有模块都是用于创建 VDBE 程序的,它之后的所有模块都是用于执行 VDBE 序的,每次执行一条指令
-
后端
- 后端由 B-tree、页缓存 (page cache) 以及操作系统接口组成
- B-tree 将页面组织成树状结构,这种组织结构很适合搜索,页面就是树的叶子
- pager (SQLite 的一种数据结构) 帮助 B-tree 管理页面,它负责传输
3.3 性能和局限性
3.3.1 性能
- 在对单表进行查询时平均而言,SQLite 与其他数据库一样快。简单的 SELECT、INSERT 和 UPDATE 是相当快速的。SQLite 通常要快其他数据库,因为它在处理一个事务开始,或者一个查询计划的产生方面开销较小,并且没有调用服务器的网络或认证以及权限协商的开销
- 但是随着查询变大变复杂,查询时间使得网络调用或者事务处理开销相形见绌,SQLite 将会与其他数据库一样,这时一些大型的设计复杂的数据库开始发挥作用了
3.3.2 局限性
- 并发
- SQLite 的锁机制是粗粒度的,它允许多个读,但是一次只允许一个写
- 写锁会在写期间排他地锁定数据库,其他人在此期间不能访问数据库
- 网络
- 虽然 SQLite 数据库可以通过网络文件系统共享,但是与这种文件系统相关的潜在延时会导致性能受损
- 如果文件系统的锁实现不当,可能允许两个客户端同时修改同一个数据库文件,这必然会导致数据库出错
并发性要求低、数据小于 1TB、本地存储的应用场景下可以考虑使用 SQLite
3.4 SQLite 安装
3.4.1 SQLite on Windows
- Qt 编译安装 SQLite
-
源码下载

-
在 Qt 中新建 C 项目

-
将第 1 步下载的源码解压后全部拷贝到第 2 步中创建的 C 项目中(与 main.c 同级),并删除原有 main.c 文件(因为源码 shell.c 中也有 main 函数,会产生冲突)

-
勾选下图所示选项

-
编译成功如下

- 安装数据库查看工具 Sqlite Expert
- Sqlite Expert
3.4.2 SQLite on Linux
-
安装 SQLite
$ sudo apt-get install sqlite3 -
运行 SQLite

-
安装数据库查看工具 SQLite Browser
$ sudo apt install sqlitebrowser -y
linux 下通过 gcc 编译 sqlite3
- gcc -o sqlite3 sqlite3.c shell.c -lpthread -ldl
linux下通过arm-linux-gcc交叉编译sqlite3
- arm-linux-gcc -o sqlite3 sqlite3.c shell.c -lpthread -ldl
相关文章:
SQLite3 数据库学习(一):数据库和 SQLite 基础
参考引用 SQL 必知必会SQLite 权威指南(第二版)关系型数据库概述 1. 数据库基础 1.1 什么是数据库 数据库(database):保存有组织的数据的容器(通常是一个文件或一组文件) 可以将其想象为一个文…...
上机4KNN实验4
目录 编程实现 kNN 算法。一、步骤二、实现代码三、总结知识1、切片2、iloc方法3、归一化4、MinMaxScale()5、划分测试集、训练集6、KNN算法 .py 编程实现 kNN 算法。 1、读取excel表格存放的Iris数据集。该数据集有5列,其中前4列是条件属性…...
产品经理如何保持核心竞争力?学会这些方法
如今,内卷的风已经吹到各行各业,产品经理也不例外。想要在内卷日益严重的环境中生存下来,产品经理就需要学会保持自己的核心竞争力。那么,产品经理要如何才能在内卷时代持续保持自己的核心竞争力呢? 1、建立快速学习的…...
终知人生苦短,何必自我为难
不是少年比他当年的那个目标更强,也不是他完全丧失了冲关过坎的勇气,而是他知道了自己能力的边界和极限,迫切需要外界的帮助。 不再自我设限,不再自我挑战,而是想用最简便、最快捷、最省精力的路径,解决掉困…...
C++阶段复习‘‘‘‘总结?【4w字。。。】
文章目录 前言类和对象C类定义和对象定义类成员函数C 类访问修饰符公有(public)成员私有(private)成员受保护(protected)成员 继承中的特点类的构造函数和析构函数 友元函数内联函数this指针指向类的指针类…...
嵌入式行业算青春饭吗?
今日话题,嵌入式行业算青春饭吗?嵌入式行业的技术要求确实非常广泛,需要深厚的知识广度和深度。这意味着入行门槛较高,我们需要了解不仅是软件和硬件,还要熟悉底层接口和硬件信号的处理方式,了解数据在计算…...
【C++】非类型模板参数 | array容器 | 模板特化 | 模板为什么不能分离编译
目录 一、非类型模板参数 二、array容器 三、模板特化 为什么要对模板进行特化 函数模板特化 补充一个问题 类模板特化 全特化与偏特化 全特化 偏特化 四、模板为什么不能分离编译 为什么 怎么办 五、总结模板的优缺点 一、非类型模板参数 模板参数分两类&#x…...
解决 Django 开发中的环境配置问题:Windows 系统下的实战指南20231113
简介: 在本文中,我想分享一下我最近在 Windows 环境下进行 Django 开发时遇到的一系列环境配置问题,以及我是如何一步步解决这些问题的。我的目标是为那些可能遇到类似困难的 Django 开发者提供一些指导和帮助。 问题描述: 最近…...
C语言仅凭自学能到什么高度?
今日话题,C语言仅凭自学能到什么高度?学习C语言的决定我确实非常推荐,毕竟它是编程领域的“通用工具”,初学者可以尝试并在发现编程的乐趣后制定长期学习计划。至于能够达到何种高度,这实在无法准确回答。即使是经验丰…...
Python爬虫过程中DNS解析错误解决策略
在Python爬虫开发中,经常会遇到DNS解析错误,这是一个常见且也令人头疼的问题。DNS解析错误可能会导致爬虫失败,但幸运的是,我们可以采取一些策略来处理这些错误,确保爬虫能够正常运行。本文将介绍什么是DNS解析错误&am…...
vue devtools 调试工具安装配置
方式一:在谷歌商店下载安装 打开Google Chrome浏览器 --> 右上角三个点图标 --> 更多工具 --> 扩展程序 --> 在 Chrome 应用商店中查找扩展程序和主题背景 方式二:下载插件安装包自行配置 下载devtools安装包 使用git下载,内含…...
kube-bench-CIS基准的自动化扫描工具学习
仓库地址:GitHub - aquasecurity/kube-bench: Checks whether Kubernetes is deployed according to security best practices as defined in the CIS Kubernetes Benchmark kube-bench,检查 Kubernetes 是否根据 CIS Kubernetes 基准中定义的安全最佳实践部署,下载…...
springboot(ssm 拍卖行系统 在线拍卖平台 Java(codeLW)
springboot(ssm 拍卖行系统 在线拍卖平台 Java(code&LW) 开发语言:Java 框架:ssm/springboot vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.7(或8.0)…...
go语言rpc初体验
go语言rpc初体验 package mainimport ("net""net/rpc" )// 注册一个接口进来 type HelloService struct { }func (s *HelloService) Hello(request string, replay *string) error {//返回值是通过修改replay的值*replay "hello " requestret…...
嵌入式LINUX——环境搭建 windows、虚拟机、开发板 互ping
摘要: 本文包含,如果设置linux开发板和虚拟机、windows 互ping成功 以及设置过程中出现的虚拟机、开发板查询不到eth0 windows ping开发板出项丢包等问题的解决方式。 windows端设置 windows端插入USB转网卡 打开windows桌面下右下角的网络标识 打开“更改适配器选项”…...
评论:AlexNet和CaffeNet有何区别?
一、说明 在这个故事中,我们回顾了AlexNet和CaffeNet。AlexNet 是2012 年ILSVRC(ImageNet 大规模视觉识别竞赛)的获胜者,这是一项图像分类竞赛。而CaffeNet是AlexNet的单GPU版,因此,我们平时在普通电脑的Al…...
什么是 IT 资产管理(ITAM),以及它如何简化业务
IT 资产管理对任何企业来说都是一项艰巨的任务,但使用适当的工具可以简化这项任务,例如,IT 资产管理软件可以为简化软件和硬件的管理提供巨大的优势。 什么是 IT 资产管理 IT 资产管理(ITAM)是一组业务实践ÿ…...
git快速上传代码
① git init; 初始化git,之后在文件夹里有.git文件,这个需要 勾选才能查看。 ② git remote add test myFisrtTest: 测试专用 这里的test是自定义的,myFisrtTest: 测试专用 是远程仓库 ③ git branch -a 这里是查看分支 ④ …...
stable diffusion comfyui的api使用教程
一、为什么要使用comfyui的api?对比webui的api,它有什么好处? 1、自带队列 2、支持websocket 3、无需关心插件是否有开放api接口,只要插件在浏览器中可以正常使用,接口就一定可以使用 4、开发人员只需关心绘图流程的搭建 5、切换…...
Swift中的strong, weak, unowned
在 Swift 中,strong, weak, 和 unowned 关键词用于管理内存中对象的引用。这些关键词与 Swift 的自动引用计数(ARC)系统紧密相关,用于防止内存泄漏和强引用循环。下面是对这三种引用类型的简要说明: 1. Strong 默认行…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
