关系型数据库 - MySQL I
MySQL 数据库
MySQL 是一种关系型数据库。开源免费,并且方便扩展。在 Java 开发中常用于保存和管理数据。默认端口号 3306。
MySQL 数据库主要分为 Server 和存储引擎两部分,现在最常用的存储引擎是 InnoDB。
指令执行过程
MySQL 数据库接收到用户指令后,首先由 Server 负责对数据操作的分析、处理和优化,再交给存储引擎执行数据存取操作。
连接器
连接器负责用户登录数据库时的身份认证,校验账户密码。校验通过后连接器会连接到权限表,并读取该用户的所有权限。如果连接未断开,即使该用户权限被管理员修改也不受影响。
查询缓存
缓存 SELECT 语句以及返回的结果。收到查询语句会首先和缓存比对,如果相同就直接从查询缓存里返回数据。
更新表后,这个表上的所有的查询缓存都会被清空。这导致实际使用场景中查询缓存的作用非常少,在 MySQL 8.0 版本后移除。
分析器
如果查询语句未命中缓存,或者是更新语句,那么将由分析器负责分析 SQL 语句的用途。
-
词法分析:提取关键字,提取 SQL 语句的关键元素,明确 SQL 语句的功能。
-
语法分析:判断 SQL 语句是否正确,是否符合 MySQL 的语法。如果不符合语法则返回错误信息。
优化器
明确 SQL 语句功能后,由优化器负责选择尽可能最优的执行方案。比如多个索引的时候选择索引,多表查询的时候选择关联顺序。
执行器
确定执行方案后,由执行器负责校验该用户有没有权限,并交由存储引擎执行语句,然后从存储引擎返回数据。
存储引擎
实际执行对数据库数据的存取。目前 MySQL 默认使用 InnoDB 引擎。相比于过去使用 MyISAM 引擎,有以下几个优势:
- 索引:数据文件本身是主索引。
- 外键:支持外键。
- 事务:添加本地日志,支持安全恢复;支持行级锁,提高并发度。
- 并发:支持多版本并发控制,提升性能。
索引
存储结构
MySQL 数据库使用以下两种数据结构存储和查找数据:
- B+ 树:(默认)适用于连续查询多条数据。
- 哈希表:适用于查询单条数据。
索引类型
索引名称|索引类型|字段类型|备注 -|-|- PRIMARY KEY|主索引|主键|字段值不能重复,也不能为空。 INDEX|普通索引|自定义字段|无,效率低。 UNIQUE|唯一索引|自定义字段|字段值不能重复,效率高。 FULLTEXT|文本索引|自定义字段|无,用于文本检索。
- 主索引
在 InnoDB 存储引擎中数据文件本身就是主索引(聚簇索引):数据以 B+ 树形式存储,根据主键值进行排序。
我们可以为其他字段建立辅助索引(非聚簇索引),以提高对字段的查询速度,但同时会降低表的更新速度。在辅助索引中记录主键值而不是字段地址:根据辅助索引查找后,仍需要根据主键值在主索引中查询数据。
- 组合索引
索引内可以包含多个字段,N 个字段的组合索引实际建立了 N 个索引。
对 a/b/c 三个字段建立的组合索引,实际会先在 a 索引中查找,再到 a/b 索引中查找,最后在 a/b/c 索引中查找。
视图
视图是一个虚拟表,不实际存储数据。其内容会通过查询其他表得到,在引用视图时动态生成。
- 权限管理:表的权限管理不能限制到具体的行和列,但通过视图则可以限制用户能得到的结果集。
- 数据独立:表的结构发生变化,不会对用户使用视图查询到的数据产生影响。
外键
从表通过外键关联到主表的主键,建立数据表之间的关系。
- 优点:保障数据的一致性和完整性。
- 缺点:增加数据之间的耦合度,难以集群。因此不推荐使用外键。
删除策略
对主表的数据进行 UPDATE/DELETE 操作时,将会影响到关联的从表。
| 外键模式 | 删除策略 |
|---|---|
| 限制 | (默认)从表有相关数据时,主表不能更新/删除。 |
| 级 联 | 主表记录更新/删除时,从表相关记录也会被更新/删除。 |
| 设置 NULL | 主表数据更新/删除时,从表相关记录的外键值被设为 NULL。 |
| 无操作 | 啥也不做 |
日志
当数据库数据发生更改时,用日志记录数据库操作。当发生错误或者冲突时,可以进行回滚。保证数据的一致性。
bin log 归档日志
最开始 MySQL 并没与 InnoDB 引擎,其他存储引擎只有通用的 bin 日志用来归档(位于 server 层)。
InnoDB 引擎完成主存数据更新后向执行器提交,由 bin 日志记录操作。如果主存数据已更新,且 bin 日志没有被写入时数据库崩溃,后续进行机器备份的时候就会丢失原有数据。这导致数据没有安全恢复的能力:一旦数据库发生异常重启,之前提交的记录都会丢失。
redolog 重做日志
MySQL 引入 InnoDB 引擎后,自带了 redo 日志。用于数据库发生异常重启时系统记录的恢复。
- InnoDB 引擎完成主存数据更新但还未提交时,由 redo 日志记录操作并进入 prepare 状态。
- InnoDB 引擎向执行器提交时,由 bin 日志记录操作。
- 提交完成后执行器通知 InnoDB 引擎,redo 日志进入 commit 状态。
如果 bin 日志没有被写入时数据库崩溃,后续进行机器备份的时候就会按照 redo 日志恢复数据。
如果 bin 日志已经写完但 redo 日志还处于 prepare 状态时数据库崩溃。MySQL 会判断 redo 日志是否完整,如果完整就立即提交。否则再判断 bin 日志是否完整,如果完整就提交 redo 日志,不完整就回滚事务。这样就解决了数据一致性的问题。
事务
事务是逻辑上的一组操作,要么都执行,要么都不执行。保障数据之间的同步。
事务特性 ACID
- 原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
- 一致性: 执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的;
- 隔离性: 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
- 持久性: 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。
并发事务潜在问题
- 丢失修改
事务(T1)修改数据的过程中,另一个并发事务(T2)也修改了该数据。导致事务(T1)对数据的修改丢失。
- 脏读
事务(T1)修改数据但还未写入数据库时,另一个并发事务(T2)使用了该数据。导致事务(T2)读取数据可能是不正确的。
- 不可重复读
事务(T1)两次读取数据的过程中,另一个并发事务(T2)修改了该数据。导致事务(T1)两次读取数据的结果不同。
- 幻读
事务(T1)两次读取数据集合的过程中,另一个并发事务(T2)插入或删除了部分数据。导致事务(T1)两次读取数据的结果不同。
数据锁
存储引擎通过给数据加锁来保障事务性。MyISAM 引擎只支持表级锁,而 InnoDB 存储引擎支持行级锁和表级锁,默认为行级锁。
-
表级锁:对当前操作的整张表加锁,实现简单,资源消耗也比较少,加锁快,不会出现死锁。但触发锁冲突的概率最高,并发度低。
-
行级锁:只针对当前操作的数据行加锁。大大减少数据库操作的冲突,并发度高。但加锁的开销也最大,可能会出现死锁。
InnoDB支持三种行锁定方式:
- 间隙锁:锁定索引的记录间隙,确保索引记录的间隙不变。
Next-Key Lock 是行级锁和间隙锁的组合使用。当 InnoDB 扫描索引记录的时候,会首先对索引记录加上行锁(Record Lock),再对索引记录两边的间隙加上间隙锁(Gap Lock)。其他事务就不能在这个间隙修改或者插入记录。间隙锁是针对事务隔离级别为可重复读或以上级别,可以有效防止幻读的发生。
事务隔离级别
- READ-UNCOMMITTED(RU) 读取未提交
事务进行读操作时允许其他事务访问,事务进行写操作将会禁止其他事务写。
- READ-COMMITTED(RC) 读取已提交
事务进行读操作时允许其他事务访问,事务进行写操作将会禁止其他事务读写。
- REPEATABLE-READ(RR) 可重复读
事务进行读操作时会禁止其他事务写,事务进行写操作将会禁止其他事务读写。
- SERIALIZABLE 可串行化
事务进行读写操作时,都会禁止其他事务读写。
| 隔离级别 | 丢失修改 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|---|
| 读取 - 未提交 | × | √ | √ | √ |
| 已提交读 | × | × | √ | √ |
| 可重复读取 | × | × | × | √ |
| 序列 化 | × | × | × | × |
- InnoDB 存储引擎默认支持的隔离级别是 REPEATABLE-READ(RR) ,且 InnoDB 在该事务隔离级别下使用 Next-Key Lock 锁算法,可以避免幻读。
- InnoDB 存储引擎在分布式事务情况下一般会用到 SERIALIZABLE 隔离级别。
MVCC 公司
MVCC 概念
MVCC 即多版本并发控制,维持一个数据的多个版本,使得读写操作没有冲突。从而提高数据库并发性能,做到即使有读写冲突时,也能不加锁非阻塞并发读。
是乐观锁的一整实现方式,就是每行都有版本号,保存时根据版本号决定是否成功。
读类型
-
当前读
读取的是记录最新版本,同时会对读取的记录进行加锁保证其他并发事务不能修改 选择 Share Mode 中的 Lock (共享锁), select for update ;更新、插入、删除
- 快照读
可能读到的是数据之前的历史版本.在很多情况下,避免了加锁操作,降低了开销;
像不加锁的select操作就是快照。但如果隔离级别是最高级串行化,快照读会退化成当前读。
MVCC 实现
在 InnoDB 存储引擎中,每行记录除了我们自定义的字段外,还会隐式记录:
- 最近修改:记录创建这条记录/最后一次修改该记录的事务ID
- 回滚指针:指向这条记录的上一个版本,存储于 rollback segment 里。
- 隐藏主键:如果数据表没有主键,InnoDB 会自动产生一个自增的聚簇索引。
- 删除标记:标记该记录是否已被删除。
事务进行快照读操作的时候生产的读视图(Read View),在该事务执行的快照读的那一刻,会生成数据库系统当前的一个快照,记录并维护系统当前活跃事务的ID(当每个事务开启时,都会被分配一个ID, 这个ID是递增的,所以最新的事务,ID值越大)。
InnoDB 会根据读取事务 ID 判断应该都什么时间段的数据。
在RC隔离级别下,是每个快照读都会生成并获取最新的Read View;而在RR隔离级别下,则是同一个事务中的第一个快照读才会创建Read View,之后的快照读获取的都是同一个Read View。
数据类型
字符串类型
常用的字符串类型有定长字符串 CHAR 和变长字符串 VARCHAR 两种,必须用数字注明可容纳的字符数。
- CHAR(n) 表示固定容纳 n 个字符,当少于 n 个字符时,会使用空格填充。
- VARCHAR(n) 表示最多容纳 n 个字符,当少于 n 个字符时不会补空。起始位和结束位需要额外 3 字节。
英文字母单个字符占 1 字节。汉字单个字符 UTF-8 编码占 3 字节,GBK 编码占 2 字节。
对于长字符串数据可以用 TEXT 或 BLOB 类型存储,固定占用 65535 字节。其中 TEXT 保存文本格式,BLOB 保存二进制格式。如果需要存储更短或更长的字符串类型数据,可以使用 TEXT/BLOB 的扩充类型:如 TINYTEXT、MEDIUMTEXT 和 LONGTEXT。
| 类型名称 | 大小(字节) | 数据库类型 | JAVA 类型 |
|---|---|---|---|
| 字符 (n) | N(0-255) | 煳 | 字符串 |
| VARCHAR(瓦查尔) | N+3(0-65535) | 瓦查尔 | 字符串 |
| 发短信 | 65535 | 瓦查尔 | 字符串 |
| 斑点 | 65535 | 斑点 | 字节 |
CHAR 类型最大只能容纳 255 字节数据,已不推荐使用。目前 VARCHAR 支持容纳最大 65535 字节数据,且长度不固定能有效节省数据库空间,推荐尽量使用 VARCHAR 数据类型取代 TEXT。
数据类型不支持 MySQL 内存临时表,进行排序等操作必须在磁盘中进行。尽量不要使用,一定要用建议单独建表。
整型 & 浮点型
布尔型
布尔型数据用 BIT 表示。
| 类型名称 | 大小(字节) | 取值 | JAVA 类型 |
|---|---|---|---|
| 位 | 1 | 0 或 1 | 布尔 |
整型
整形数据一般用 INT/INTEGER 表示,固定占用 4 字节。如果需要存储更短或更长的整型数据,可以使用 INT 的扩充类型:如 TINYINT、SMALLTEXT 和 MEDIUMTEXT 和 BIGINT。
在声明整型数据时也可以注明显示位宽,如 int(n)。在整形数据不足 n 位时会自动补零,几乎没有任何用处。
| 类型名称 | 大小(字节) | 表示范围 | JAVA 类型 |
|---|---|---|---|
| TINYINT 公司 | 1 | (-128,127)(0,255) | 整数 |
| SMALLINT | 2 | (-32 768,32 767)(0,65 535) | 整数 |
| MEDIUMINT | 3 | (-8 388 608,8 388 607)(0,16 777 215) | 整数 |
| INT/整数 | 4 | (-2 147 483 648,2 147 483 647)(0,4 294 967 295) | 整数 |
| BIGINT | 8 | 非常大 | BigInteger (大整数) |
浮点型
常用的浮点型数据类型有 FLOAT/DOUBLE ,FLOAT 类型固定占用 4 字节,DOUBLE 类型固定占用 8 字节。但 FLOAT/DOUBLE 只是近似存储,在数据库中我们常用 DECIMAL 类型记录金额,在数据库中实际以字符串形式存储,以确保不会产生任何误差。
- DECIMAL(M,D) M 表示最大位数,D 表示小数点右侧的位数。如 DECIMAL(5,2) ,小数点前 3 位,小数点后 2 位。
| 类型名称 | 大小(字节) | 表示范围 | JAVA 类型 |
|---|---|---|---|
| 浮 | 4 | 浮 | |
| 双 | 8 | 双 | |
| 十进制 (M,D) | M + 2 | BigDecimal 小数 |
日期类型
java.sql 包内有专用 Java 类型匹配,注意数据类型必须是 ,而不是 。java.sql.Datejava.util.Date
| 类型 | 大小(字节) | 格式 | 表示范围 | JAVA 类型 |
|---|---|---|---|---|
| 年 | 1 | YYYY | 1901/2155 | 日期 |
| 日期 | 3 | YYYY-MM-DD | 1000-01-01/9999-12-31 | 日期 |
| 时间 | 3 | HH:MM:SS | -838:59:59'/'838:59:59 | 时间 |
| 时间戳 | 4 | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:00/2038-1-19 11:14:07 | 时间戳 |
| 日期时间 | 8 | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00/9999-12-31 23:59:59 | 时间戳 |
枚举 & 集合
create table tab( gender enum('male','remale','secret') -- gender 属性为枚举类型
); insert into tab values ('remale'); select * from tab where gender=2; -- 两者等价select * from tab where gender= 'remale';复制到剪贴板错误复制
记录字符串,但底层数据实际以2个字节的整型(smallint)保存。
在已知的值中进行单选。最大数量为65535.按保存的位置顺序,从1开始逐一递增。
NULL值的索引是NULL。空字符串错误值的索引值是0。
create table tab( gender set('male','remale','secret') -- gender 属性为集合类型
); insert into tab values ('male', 'remale'); 复制到剪贴板错误复制
记录字符串,但底层数据实际以8个字节的整型(bigint)保存。
在已知的值中进行多选。最多有 64 个成员。
-- 查询 flag 字段包含 a,b 的字段 mysql -> select * from table_name where FIND_IN_SET('a,d', flag);
相关文章:
关系型数据库 - MySQL I
MySQL 数据库 MySQL 是一种关系型数据库。开源免费,并且方便扩展。在 Java 开发中常用于保存和管理数据。默认端口号 3306。 MySQL 数据库主要分为 Server 和存储引擎两部分,现在最常用的存储引擎是 InnoDB。 指令执行过程 MySQL 数据库接收到用户指令…...
解锁AI写作新境界:5款工具让你的论文创作事半功倍
在这个数字化飞速发展的时代,人工智能(AI)已经不再是科幻小说中的幻想,而是实实在在地融入了我们的日常生活。特别是在学术领域,AI技术的介入正在改变传统的论文写作方式。你是否还在为撰写论文而熬夜苦战?…...
一文读懂多组学联合分析产品在医学领域的应用
疾病的发生和发展通常涉及多个层面的生物学过程,包括基因表达、蛋白质功能、代谢物变化等。传统的单一组学研究只能提供某一层面的信息,而多组学关联分析能够综合多个层面的数据,提供更全面、更深入的疾病理解。例如,通过分析患者…...
js react 笔记 2
起因, 目的: 记录一些 js, react, css 1. 生成一个随机的 uuid // 需要先安装 crypto 模块 const { randomUUID } require(crypto);const uuid randomUUID(); console.log(uuid); // 输出类似 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d 2. 使用 props, 传递参数…...
快速使用react 全局状态管理工具--redux
redux Redux 是 JavaScript 应用中管理应用状态的工具,特别适用于复杂的、需要共享状态的中大型应用。Redux 的核心思想是将应用的所有状态存储在一个单一的、不可变的状态树(state tree)中,状态只能通过触发特定的 action 来更新…...
活动系统开发之采用设计模式与非设计模式的区别-非设计模式
1、父类Base.php <?php /*** 初始化控制器* User: Administrator* Date: 2022/9/26* Time: 18:00*/ declare (strict_types 1); namespace app\controller; use app\model\common\Token; use app\BaseController; use app\BaseError; use OpenSSL\Encrypt; use app\model…...
JVM面试(六)垃圾收集器
目录 概述STW收集器的并发和并行 Serial收集器ParNew收集器Parallel Scavenge收集器Serial Old收集器Parallel Old收集器CMS收集器Garbage First(G1)收集器 概述 上一章我们分析了垃圾收集算法,那这一章我们来认识一下这些垃圾收集器是如何运…...
固态硬盘装系统有必要分区吗?
前言 现在的新电脑有哪一台是不使用固态硬盘的呢?这个好像很少很少了…… 有个朋友买了一台新的笔记本电脑,开机之后,电脑只有一个分区(系统C盘500GB)。这时候她想要给笔记本分区…… 这个真的有必要分区吗…...
网络安全架构师
网络安全架构师负责构建全面的安全框架,以保护组织的数字资产免受侵害,确保组织在数字化转型的同时维持强大的安全防护。 摩根大通的网络安全运营副总裁兼安全架构总监Lester Nichols强调,成为网络安全架构师对现代企业至关重要,…...
如何本地部署Ganache并使用内网穿透配置公网地址远程连接测试网络
目录 前言 1. 安装Ganache 2. 安装cpolar 3. 创建公网地址 4. 公网访问连接 5. 固定公网地址 作者简介: 懒大王敲代码,计算机专业应届生 今天给大家聊聊如何本地部署Ganache并使用内网穿透配置公网地址远程连接测试网络,欢迎大家点赞 &a…...
算法岗/开发岗 实况
深信服算法岗一面 第一题 树的直径有哪些解法 两次dfs和树形dp,讲了一下树形dp的思路 因为我的简历写的比较少,所以面试官问我一些个人信息和擅长哪方面。 我说:ACM大一下打到大三,然后去考研。dp写的多一点,还有思维…...
Nginx跨域运行案例:云台控制http请求,通过 http server 代理转发功能,实现跨域运行。(基于大华摄像头WEB无插件开发包)
文章目录 引言I 跨域运行案例开发资源测试/生产环境,Nginx代理转发,实现跨域运行本机开发运行II nginx的location指令Nginx配置中, 获取自定义请求header头Nginx 配置中,获取URL参数引言 背景:全景监控 需求:感知站点由于云台相关操作为 http 请求,http 请求受浏览器…...
【数据分析预备】Pandas
Pandas 构建在NumPy之上,继承了NumPy高性能的数组计算功能,同时提供更多复杂精细的数据处理功能 安装 pip install pandas导入 import pandas as pdSeries 键值对列表 # 创建Series s1 pd.Series([5, 17, 3, 26, 31]) s10 5 1 17 2 3 3 26 4 31 dt…...
MATLAB-基于高斯过程回归GPR的数据回归预测
目录 目录 1 介绍 1. 1 高斯过程的基本概念 1.2 核函数(协方差函数) 1.3 GPR 的优点 1.4. GPR 的局限 2 运行结果 3 核心代码 1 介绍 高斯过程回归(Gaussian Process Regression, GPR)是一种强大的非参数贝叶斯方法&…...
欧洲国际眼科盛会,中国眼科专家周进斩获六项屈光大奖
2024年第42届欧洲白内障和屈光外科医生协会(ESCRS)大会由世界青光眼协会(WGA)、欧洲白内障和屈光外科医生协会(ESCRS)主办,于2024年9月6日至10日在西班牙巴塞罗那举行。 这场眼科盛会,汇聚了来自全球130多个国家的上万名眼科医学领域的顶尖专家、学者和临…...
MySQL——数据库的高级操作(二)用户管理(2)创建普通用户
在创建新用户之前,可以通过 SELECT 语句查看 mysql.user 表中有哪些用户,查询结果如下: mysql> USE mysql; Database changed mysql> SELECT Host, User, authentication_string FROM mysql.user; ----------------------------------…...
VIT论文阅读
把图片看成一个个16x16的patch堆起来的 摘要 卷积神经网络不是必备的,一个纯transformer表现也是非常好的 transformer?2500天tpu v3 介绍 大规模上预训练,小规模任务数据集上微调。扩大模型时候还没观察到瓶颈(还没出现过拟合…...
Python编程入门必备:def关键字与函数参数
在Python编程中,函数是组织代码、实现代码复用和模块化的基础单元。通过函数,可以将复杂的操作封装成独立的代码块,提高代码的可读性和维护性。本文将详细介绍Python中函数的定义和使用,包括def关键字、函数参数的各种类型以及函数…...
LiveKit的agent介绍
概念 LiveKit核心概念: Room(房间)Participant(参会人)Track(信息流追踪) Agent 架构图 订阅信息流 agent交互流程 客户端操作 加入房间 房间创建方式 手动 赋予用户创建房间的…...
青龙面板 升级 及其 依赖更新修复 检测and日志删除等
青龙版本升级 先关闭服务 cd qinglong目录 docker-compose down 关闭 docker pull whyour/qinglong:版本号 //版本号自行选择,如果是为了修复错误,建议版本微升,不然就直接latest 启动 docker-compose up -d 进入容器࿰…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
