news 2026/8/27 3:33:27

MySQL 8.0从入门到实战:安装部署、SQL操作与常见排错指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL 8.0从入门到实战:安装部署、SQL操作与常见排错指南

这次我们直接说 MySQL。它是目前互联网行业使用最广泛的开源关系型数据库,几乎每个做后端开发的人都要过一遍。今天这篇不是概念复述,而是带你把“装库、建表、写 SQL、连服务、排错误”整个链路跑通。重点放在新手真正用得上的部分:安装方式、基础 SQL、常见报错、性能观察和工程习惯。

如果你正准备从零开始学数据库,或者刚进公司要接手一个带 MySQL 的业务系统,这篇可以直接收藏。内容按照实测环境下的操作顺序来组织,先讲能做什么,再讲怎么做,最后给排查思路。读完你至少能完成这几件事:本机装好 MySQL 8.0、用命令行和客户端连接、创建数据库和数据表、完成增删改查、写出带排序分页的查询、用 Python 或 Node.js 接入数据库,以及处理连接失败、端口占用、认证报错这些高频问题。

1. MySQL 核心能力速览

先给一张速查表,让你在往下读之前就清楚 MySQL 到底是什么、适合什么场景、需要什么环境。

项目说明
项目类型开源关系型数据库管理系统
当前主流版本8.0(5.7 已逐渐停止维护,新项目优先 8.0)
核心能力数据存储、SQL 查询、事务处理、索引优化、存储过程、触发器、视图、主从复制
支持平台Windows、Linux、macOS、Docker
默认端口3306
连接方式命令行、图形客户端(Navicat/DBeaver/MySQL Workbench)、编程语言驱动
适合场景业务系统数据存储、Web 后端、数据分析、ERP/WMS/CRM 等管理系统
学习门槛低,SQL 语法相对直观,先掌握 DDL/DML/DQL 就能上手
接口能力官方提供多种语言的 Connector,支持 HTTP 之外的 TCP 协议直连

这张表里最值得关注的是版本选择。如果你正在新学,直接装 8.0;如果公司旧系统还在 5.7,也不用慌,核心 SQL 语法基本通用,差异主要在认证插件、窗口函数和部分系统表结构上。

2. 适用场景与使用边界

MySQL 适合做什么?最常见的几类:

  • Web 应用后端存储,比如用户表、订单表、商品表。
  • 企业管理系统,比如 ERP 里的库存管理、WMS 的入库出库记录。
  • 数据报表和分析系统的底层数据源。
  • 与 Redis、Elasticsearch 配合,作为持久化主库。

不适合什么场景?几 TB 以上的海量数据分析,MySQL 不是最优解,这类需求通常交给数据仓库;高并发写入量极大的场景需要分库分表或引入其他存储;非结构化文件建议单独做对象存储。

新手还要建立一个边界意识:MySQL 存的是业务数据,不是垃圾箱。删除和更新操作必须谨慎,生产环境要避免不带 WHERE 条件的 UPDATE 和 DELETE。学习阶段最好用测试库练习,不要拿线上数据试手。涉及个人信息的表结构设计,要注意脱敏和权限控制,最小化账号权限,避免用 root 跑所有业务。

3. 环境准备与前置条件

MySQL 的安装环境没有太多硬性门槛,普通开发机都能跑。先检查这几项:

  • 操作系统:Windows 10/11、Ubuntu、CentOS、macOS 都可以。
  • 磁盘空间:MySQL 8.0 安装后约占用 1-2GB,数据目录另算。
  • 内存:2GB 以上基本够用,4GB 更稳。
  • 端口:3306 不能被占用,如果之前装过 MySQL 或者有其他数据库占用,需要换端口或先停掉旧服务。
  • 权限:需要管理员权限安装服务、写入系统目录。

如果本机已经有旧版本 MySQL,建议先确认一下版本和认证方式,避免安装 8.0 后出现连接报错。新老版本共存也不是不行,但新手不建议一开始就搞多版本环境,先跑通一套再说。

4. 安装部署与启动方式

4.1 Windows 安装

Windows 推荐下载 MySQL Installer,选择 Server only 或 Developer Default 都行。安装类型选 Server only 更省事。安装过程中会让你设置 root 密码,记好。如果选 Developer Default,会自动装 MySQL Workbench。

安装完成后,在系统服务中能看到 MySQL80 服务。启动方式:

net start MySQL80

如果服务没装成功,可以用管理员权限的终端手动初始化:

mysqld --initialize-insecure mysqld --install MySQL80 net start MySQL80

--initialize-insecure会生成一个无密码的 root 账号,适合开发机快速测试。生产环境不要用这种方式。

4.2 Linux 安装

Ubuntu / Debian 系列:

sudo apt update sudo apt install mysql-server -y sudo systemctl start mysql sudo systemctl enable mysql

CentOS / Rocky Linux 系列:

sudo dnf install mysql-server -y sudo systemctl start mysqld sudo systemctl enable mysqld

Linux 安装后,root 默认可能使用 auth_socket 认证,命令行里直接sudo mysql能进去,但远程工具连不上。需要改成密码认证:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码'; FLUSH PRIVILEGES;

MySQL 8.0 默认认证插件是 caching_sha2_password,如果后续用老版本客户端连接报认证问题,可以改成 mysql_native_password,但更推荐升级客户端驱动。

4.3 Docker 安装

Docker 方式最干净,适合不想污染本机环境的场景:

docker run --name mysql8 \ -e MYSQL_ROOT_PASSWORD=123456 \ -p 3306:3306 \ -v mysql_data:/var/lib/mysql \ -d mysql:8.0

进入容器:

docker exec -it mysql8 mysql -uroot -p

Docker 启动的优点是卸载方便,缺点是数据要确保挂载到宿主机目录,否则容器删除后数据丢失。

4.4 服务访问确认

无论哪种安装方式,安装后先确认服务是否在监听端口:

mysql -uroot -p

输入密码后如果看到如下提示,说明连接成功:

Welcome to the MySQL monitor. Commands end with ; or \g. Server version: 8.0.x

然后再确认端口:

netstat -ano | findstr 3306

Linux 上是:

ss -lntp | grep 3306

5. 基础 SQL 实操:从建库到数据查询

这块是新手最该花时间的部分。我们把操作拆成几组,每一组都有目的、步骤和预期结果。

5.1 数据库操作

登录后先查看已有数据库:

SHOW DATABASES;

创建一个学习用的库:

CREATE DATABASE learn_mysql DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

切换当前库:

USE learn_mysql;

删除库:

DROP DATABASE learn_mysql;

新手容易忽略的是字符集设置。MySQL 8.0 默认字符集是 utf8mb4,比 utf8 更适合存表情和生僻字。如果建库时看到乱码,大概率是字符集不统一。

5.2 数据表设计

建一张学生表,包含主键、姓名、年龄、入学时间、分数这些基础字段:

CREATE TABLE student ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, age TINYINT UNSIGNED, score DECIMAL(5,2), enrollment_date DATE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );

查看表结构:

DESC student;

修改表结构是新手数据库课程里常考也常踩坑的部分:

-- 新增字段 ALTER TABLE student ADD COLUMN email VARCHAR(100); -- 修改字段类型 ALTER TABLE student MODIFY COLUMN age INT UNSIGNED; -- 删除字段 ALTER TABLE student DROP COLUMN email; -- 给字段加唯一约束 ALTER TABLE student ADD UNIQUE KEY uk_name (name);

加唯一约束时如果表里已有重复数据,命令会报错。正确顺序是先查重复:

SELECT name, COUNT(*) FROM student GROUP BY name HAVING COUNT(*) > 1;

5.3 插入与查询

插入数据:

INSERT INTO student (name, age, score, enrollment_date) VALUES ('张三', 20, 88.5, '2024-09-01'), ('李四', 21, 91.0, '2024-09-01'), ('王五', 19, 76.5, '2025-03-01');

基础查询:

SELECT * FROM student;

条件过滤、排序、分页一起练:

-- 查询分数大于80的学生,按分数降序 SELECT name, score FROM student WHERE score > 80 ORDER BY score DESC; -- 分页查询:每页2条,取第2页 SELECT id, name, score FROM student ORDER BY id LIMIT 2 OFFSET 2;

LIMIT 语法在很多面试题里都会出现,背下来比临时查快得多。

聚合查询与分组:

-- 平均分 SELECT AVG(score) AS avg_score FROM student; -- 每个年龄段的人数 SELECT age, COUNT(*) AS cnt FROM student GROUP BY age;

UPDATE 和 DELETE 是高风险操作,新手最容易在这里出错。核心纪律是:没有 WHERE 就不要执行。

-- 正确示例:只更新张三的分数 UPDATE student SET score = 95.0 WHERE name = '张三'; -- 危险示例:全表覆盖 -- UPDATE student SET score = 95.0; -- 删除指定记录 DELETE FROM student WHERE id = 3;

5.4 常用函数与排序

实际写 SQL 时,函数是最常用的工具。先记住这几类:

-- 字符串函数 SELECT UPPER(name), LENGTH(name) FROM student; -- 日期函数 SELECT NOW(), CURDATE(), DATE_ADD(NOW(), INTERVAL 7 DAY); -- 条件判断 SELECT name, CASE WHEN score >= 90 THEN '优秀' WHEN score >= 80 THEN '良好' ELSE '一般' END AS level FROM student;

排序要注意空值处理。MySQL 默认排序中 NULL 值在升序时排在最前,如果想让 NULL 排到最后:

SELECT * FROM student ORDER BY score IS NULL, score ASC;

5.5 连接查询与子查询

实际业务很少只查一张表。先建一张班级表,然后用 JOIN 关联:

CREATE TABLE class ( id INT PRIMARY KEY, name VARCHAR(50) ); INSERT INTO class VALUES (1, '软件1班'), (2, '软件2班'); ALTER TABLE student ADD COLUMN class_id INT; UPDATE student SET class_id = 1 WHERE id IN (1, 2); UPDATE student SET class_id = 2 WHERE id = 3;

内连接查询学生和班级信息:

SELECT s.name, c.name AS class_name FROM student s INNER JOIN class c ON s.class_id = c.id;

左连接:

SELECT s.name, c.name AS class_name FROM student s LEFT JOIN class c ON s.class_id = c.id;

子查询:

-- 查询分数高于全校平均分的学生 SELECT name, score FROM student WHERE score > (SELECT AVG(score) FROM student);

6. 存储过程、触发器与事务的入门用法

这部分属于进阶基础知识,也是后面阅读项目源码、做二次开发时经常遇到的。

6.1 存储过程

存储过程是把一组 SQL 打包成一个可重复调用的任务。创建时要注意分隔符问题:MySQL 客户端默认把分号当作语句结束符,而存储过程内部也有分号,所以创建时要把分隔符临时改成别的符号。

DELIMITER $$ CREATE PROCEDURE get_student_by_score(IN min_score INT) BEGIN SELECT name, score FROM student WHERE score >= min_score; END$$ DELIMITER ;

调用:

CALL get_student_by_score(80);

删除:

DROP PROCEDURE IF EXISTS get_student_by_score;

新手最容易在触发器或存储过程里遇到DELIMITER的报错,原因就是没有修改结束符。

6.2 触发器

触发器用于在 INSERT、UPDATE、DELETE 时自动执行指定逻辑。下面示例用来记录分数修改日志:

CREATE TABLE score_log ( id INT AUTO_INCREMENT PRIMARY KEY, student_id INT, old_score DECIMAL(5,2), new_score DECIMAL(5,2), changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); DELIMITER $$ CREATE TRIGGER trg_score_update AFTER UPDATE ON student FOR EACH ROW BEGIN IF OLD.score <> NEW.score THEN INSERT INTO score_log(student_id, old_score, new_score) VALUES (OLD.id, OLD.score, NEW.score); END IF; END$$ DELIMITER ;

触发器能自动干活,但也会让隐式逻辑变多。新手维护老项目时如果发现更新一条数据却连带改了别的表,优先检查是否有触发器在起作用。

6.3 事务

事务是保证数据一致性的核心机制。经典转账场景:扣钱和加钱必须同时成功或同时失败。

START TRANSACTION; UPDATE account SET balance = balance - 100 WHERE user_id = 1; UPDATE account SET balance = balance + 100 WHERE user_id = 2; -- 检查无误后提交 COMMIT; -- 出错时回滚 -- ROLLBACK;

MySQL 默认自动提交,也就是每条 DML 语句都会立即生效。显式开启事务后,要手动 COMMIT 才真正落库。涉及多表更新的操作建议始终放在事务里。

6.4 索引与锁的初步认知

索引的作用是加速查询,但也会降低写入性能。创建索引:

CREATE INDEX idx_student_name ON student(name); -- 查看索引 SHOW INDEX FROM student;

使用索引时要注意最左前缀原则。如果索引是 (class_id, name),单独查 name 就命不中这个索引。

关于锁,先记住一个排查思路:两个事务同时更新同一行,后面的会等待。如果发生锁等待,查看阻塞来源:

-- 查看当前事务 SELECT * FROM information_schema.INNODB_TRX\G; -- 查看锁等待 SELECT * FROM sys.innodb_lock_waits\G;

线上出现“锁表”现象时,优先定位事务是否长时间未提交,然后再考虑是否要 kill 阻塞事务。新手的误区是一遇到锁就想到改隔离级别,实际多数情况是没有提交或没有加索引导致锁范围扩大。

7. 连接客户端与编程语言接入

命令行跑通了,下一步就是让图形客户端和代码项目也能连上来。

7.1 Navicat / DBeaver 连接

连接配置里填:

  • 主机:127.0.0.1
  • 端口:3306
  • 用户:root
  • 密码:安装时设置的密码

新手用 Navicat 连接 8.0 版本常遇到2059 - Authentication plugin 'caching_sha2_password'报错。两个解决办法:

  1. 换成新版 Navicat 或 DBeaver。
  2. 把用户认证方式改回 mysql_native_password。

不推荐长期使用第二种,因为在 8.0 的后续版本里 native_password 已经标记为废弃。建议优先用官方 MySQL Workbench 或新版本客户端。

如果出现Host 'xxx' is not allowed to connect,说明 root 只允许 localhost 登录。需要创建一个可远程访问的用户:

CREATE USER 'app_user'@'%' IDENTIFIED BY '你的密码'; GRANT SELECT, INSERT, UPDATE, DELETE ON learn_mysql.* TO 'app_user'@'%'; FLUSH PRIVILEGES;

生产环境不要把%放开给 root。

7.2 Python 连接 MySQL

Python 连接 MySQL 通常用 pymysql 或 mysql-connector-python。

安装:

pip install pymysql

连接测试:

import pymysql conn = pymysql.connect( host="127.0.0.1", port=3306, user="root", password="你的密码", database="learn_mysql", charset="utf8mb4" ) with conn.cursor() as cursor: cursor.execute("SELECT id, name, score FROM student WHERE score > %s", (80,)) rows = cursor.fetchall() for row in rows: print(row) conn.close()

注意参数传入不要用字符串拼接。上面示例里的%s是参数占位符,可以防止 SQL 注入,这是从新手阶段就要养成的习惯。

7.3 Node.js 连接 MySQL

Node.js 项目使用 mysql2 驱动:

npm install mysql2

连接示例:

const mysql = require('mysql2/promise'); async function main() { const conn = await mysql.createConnection({ host: '127.0.0.1', port: 3306, user: 'root', password: '你的密码', database: 'learn_mysql' }); const [rows] = await conn.execute( 'SELECT id, name, score FROM student WHERE score > ?', [80] ); console.log(rows); await conn.end(); } main().catch(console.error);

Node.js 里同样使用?占位符。后端起服务的时候,数据库连接要使用连接池,不要每次请求都新建连接,否则高并发下会打满数据库连接数。

7.4 Java 连接 MySQL

Java 后端连接方式更重,但核心依赖是 JDBC。以 Spring Boot 为例,只需在配置里声明:

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/learn_mysql?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=你的密码

Maven 依赖:

<dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> </dependency>

Java 项目连接 8.0 数据库时,驱动类名和 URL 参数与 5.7 有区别,注意看报错信息。

8. 资源占用与性能观察

MySQL 安装后默认配置偏保守,学习阶段不需要调优,但要学会观察运行状态。连接上之后执行:

SHOW GLOBAL STATUS LIKE 'Threads_connected'; SHOW GLOBAL STATUS LIKE 'Max_used_connections'; SHOW VARIABLES LIKE 'innodb_buffer_pool_size'; SHOW PROCESSLIST;

观察维度包括:

  • 连接数:Threads_connected 过大说明连接池配置有问题。
  • 慢查询:开启慢查询日志,找到执行时间超过阈值的 SQL。
  • 缓冲池:innodb_buffer_pool_size 通常设为可用内存的 60%-70%,但在开发机上不需要改。

慢查询日志开启方式:

SET GLOBAL slow_query_log = ON; SET GLOBAL long_query_time = 2;

这行配置临时生效,重启后失效。想持久化,需要改 my.cnf 或 my.ini。

新手的误区是一看到查询慢就加索引。正确的排查顺序是:先看 SQL 是否全表扫描,再看数据量,最后才考虑索引。先用 EXPLAIN 分析执行计划:

EXPLAIN SELECT * FROM student WHERE name = '张三';

如果 type 列是 ALL,说明没有走索引,需要优化。

9. 常见问题与排查方法

下面是新手高频问题清单。出现报错时,先看完整错误信息,再看是否属于下面某一类。

问题现象可能原因排查方式解决方案
安装到 Check Requirements 卡住系统缺少 VC++ 运行库查看安装日志安装对应运行库后重试
连接报 2059 错误认证插件不兼容查看客户端版本升级客户端或调整认证方式
服务启动报错端口被占用或数据目录权限不足netstat -ano查端口,查看 error log释放端口或修正数据目录权限
mysql 不是内部或外部命令环境变量未配置echo %PATH%将 MySQL 的 bin 目录加入 PATH
远程连接被拒绝用户只允许 localhost 访问查看 user 表 host 字段创建允许%访问的专用账号
UPDATE / DELETE 报错,无法更新safe-update 模式开启看错误信息提示加上 WHERE 主键条件
Docker 启动后进程直接退出数据目录权限或端口冲突docker logs查看日志修复挂载目录权限,或换端口
表数据很多,查询越来越慢缺少索引或 SQL 不是最简写法EXPLAIN 分析执行计划优化 SQL 结构并考虑加索引
存储过程/触发器创建报错DELIMITER 没设置检查创建语句用 DELIMITER 临时更改结束符

除了表里这些,再补充一个高频场景:改了 my.ini 配置后重启服务失败。这通常是因为配置项写错了,比如缩进、括号或参数名不对。从 MySQL 8.0 开始,部分参数已经不适用,修改前先查一下参数是否还存在。

10. 最佳实践与使用建议

最后这部分是工程习惯,越早养成越好。

10.1 账号与权限

不要用 root 跑业务代码。开发环境创建一个最小权限账号,只授予需要的库和操作权限。生产库的 DELETE 和 DROP 权限要严格控制。

10.2 备份策略

每天备份是最基本的要求。开发机可以手动备份,生产环境要有定时任务:

mysqldump -uroot -p learn_mysql > backup_$(date +%Y%m%d).sql

恢复:

mysql -uroot -p learn_mysql < backup_20250101.sql

mysqldump 在数据量大时耗时长,大库建议用物理备份方案,但学习阶段掌握逻辑备份足够。

10.3 SQL 规范

  • 关键字统一大写,字段和表名使用小写加下划线。
  • 每条 SQL 都要写清楚字段列表,不要滥用SELECT *
  • 更新和删除之前先 SELECT 确认范围。
  • 涉及金额使用 DECIMAL,不要用 FLOAT。
  • 时间字段使用 DATETIME 或 TIMESTAMP,不要存字符串。

10.4 学习路径

顺序建议:安装部署→SQL 增删改查→表结构设计→索引与执行计划→事务与锁→存储过程与触发器→主从复制与高可用。前四项是面试和日常开发最常考的,后面按需学习。

10.5 合规提醒

如果练习数据里包含个人信息,全部用模拟数据,不要拿真实手机号、身份证号、地址来测试。涉及公司业务数据时,先在测试库联调,确认无误后再走审批流程操作生产库。备份文件属于敏感数据,不要放在公开目录或传到公共网盘上。

11. 总结与下一步

MySQL 入门不卡在语法上,卡在动手环境和排查能力。这篇文章的核心路径是:装一个 MySQL 8.0,建一张学生表,把增删改查、排序分页、连接查询、事务、存储过程、Python/Node.js 连接全跑一遍。这套流程走完,你已经有能力读懂绝大多数单机项目的数据库代码。

最容易踩的坑有三个:一是 UPDATE 不带 WHERE,二是客户端连接 8.0 遇到认证报错不知道原因,三是触发器/存储过程创建时忘记 DELIMITER。这三个坑踩完,你的排错能力会上一个台阶。

下一步建议:找一个小型业务场景,比如学生成绩管理或进销存里的库存表,自己设计表结构,写满 100 条模拟数据,然后做几个统计查询。这个过程会逼你把表设计、索引和聚合函数都用上。之后可以继续学窗口函数、EXPLAIN 分析和主从配置。建议收藏备用,动手装库的时候对照着做。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/27 3:31:10

PW2053平芯微代理商,PWM/PFM双模式与100%占空比低压差

PW2053 同步降压调节器芯片介绍 摘要&#xff1a; PW2053是一款高效、单片式同步降压调节器&#xff0c;采用恒频电流模式架构。该芯片具有高达3A的输出电流能力&#xff0c;并支持100%占空比低dropout操作&#xff0c;非常适合单节锂离子电池供电的应用。其内部集成的功能和高…

作者头像 李华
网站建设 2026/8/27 3:30:40

eFuse电子保险丝:智能电路保护原理、选型与工程实践全解析

1. 项目概述&#xff1a;从一次“冒烟”事故说起几年前&#xff0c;我负责的一个嵌入式项目在客户现场出了状况。那是一个部署在工业环境下的数据采集终端&#xff0c;在一次雷雨天气后&#xff0c;设备彻底“变砖”&#xff0c;无法启动。现场工程师拆机检查&#xff0c;发现主…

作者头像 李华
网站建设 2026/8/27 3:30:03

Claude Design零基础入门:用对话式AI设计快速生成网页原型

这次我们来看一个对新手非常友好的 AI 设计方向&#xff1a;Claude Design。它的核心思路不是让你打开 Photoshop 或 Figma 从零开始摆画布&#xff0c;而是把“设计”这件事改写成“对话”。你描述需求&#xff0c;Claude 负责生成页面结构、布局、配色和对应代码&#xff0c;…

作者头像 李华
网站建设 2026/8/27 3:29:51

暮光时段望远镜成像劣化建模与物理约束优化

1. 这道题根本不是在测天文观测能力&#xff0c;而是在考“光与介质的博弈”看到标题里“望远镜的暮光之城因素”&#xff0c;很多人第一反应是去翻《暮光之城》小说或者查天文台选址规范——我去年带三支队伍冲认证杯D题时&#xff0c;也踩过这个坑。直到第三天凌晨两点&#…

作者头像 李华
网站建设 2026/8/27 3:28:43

SQL注入攻击原理与防御:从字符串拼接漏洞到远程API调用的安全风险

1. 从一次“意外”的API调用说起那天下午&#xff0c;我正在调试一个刚上线的用户查询功能。前端传过来一个用户名&#xff0c;后端拼接SQL去数据库里捞数据&#xff0c;一切看起来都挺正常。直到测试同事随手在输入框里敲了个admin--&#xff0c;页面返回的数据突然变成了所有…

作者头像 李华
网站建设 2026/8/27 3:24:53

Flask+MySQL图书管理系统实战:数据库设计与增删改查全解析

简介&#xff1a;关系型数据库管理系统是Web应用的核心组成&#xff0c;负责数据的持久化存储与一致性维护。在Python生态中&#xff0c;Flask作为轻量级框架&#xff0c;搭配SQLAlchemy ORM工具&#xff0c;能够高效地操作MySQL数据库&#xff0c;快速实现业务数据的管理与交互…

作者头像 李华