43-44学时:编程实践 数据库
MySQL数据库入门:用Navicat管理健康养老数据
在这4个学时中,我们将学习 MySQL 数据库基础,使用 Navicat for MySQL 可视化客户端管理数据库,结合健康养老数据的前后端项目(Python Flask API + HTML前端)。你将掌握数据库理论,操作MySQL表,并将数据库部署到阿里云ECS(通过宝塔面板管理)。课程适合初学者,逐步讲解:
MySQL核心概念和SQL语法。
用Navicat创建、查询、修改数据库。
集成健康数据API,管理姓名、血压、心率、血糖、体重、步数、时间。
连接阿里云MySQL。
课程安排
学时1:理论课 - 了解MySQL、关系型数据库、SQL。
学时2:演示课 - 老师用Navicat搭建健康数据数据库,连接Flask API。
学时3-4:实践课 - 动手操作数据库,优化表结构,连接阿里云MySQL。
开发环境
IDE:PyCharm Community Edition(用于API集成)。
数据库:MySQL(本地和阿里云)。
客户端:Navicat for MySQL(下载Navicat,免费试用版)。
浏览器:Chrome,测试API。
本地环境设置:
安装 MySQL,宝塔面板上点一下就可以安装了:
Windows:MySQL Community Server (mysql.com)。
Mac:
brew install mysql。Linux:
sudo apt install mysql-server。启动:
mysql -u root -p,创建数据库:CREATE DATABASE health_db;
安装 Navicat:
下载安装Navicat,启动后连接本地MySQL(host:
localhost, user:root, password: 你的密码)。测试连接,创建
health_db数据库。
PyCharm 项目:
使用现有“HealthAPI”项目(含
app.py,config.py)。确保依赖:
pip install flask flask-cors mysql-connector-python。
前端:
使用现有
index.html(健康数据网页)。
阿里云环境:
ECS(Ubuntu 20.04)已安装宝塔面板。
宝塔管理MySQL、Nginx、Python项目。
登录宝塔:
http://<公网IP>:8888。
学时1:理论课 - 认识MySQL和Navicat
1.1 什么是MySQL?
MySQL是开源关系型数据库,存储和管理结构化数据:
用途:保存健康数据(如姓名、血压、心率)。
特点:高效、支持多用户、适合Web应用。
与API集成:Flask通过
mysql-connector-python连接MySQL,执行查询。
1.2 关系型数据库
表:类似Excel,存储数据(如
health_data表)。字段:表中的列(如
name,blood_pressure)。记录:表中的行(如“张三, 120/80, 70”)。
主键:唯一标识记录的字段(如
id)。外键:连接多表(本课程暂不涉及)。
例子:health_data 表结构:
| id | name | blood_pressure | heart_rate | blood_sugar | weight | steps | timestamp |
|---|---|---|---|---|---|---|---|
| 1 | 张三 | 120/80 | 70 | 5.5 | 70.5 | 10000 | 2025-05-10 10:00:00 |
1.3 SQL语法
SQL(结构化查询语言)操作MySQL:
创建表:
CREATE TABLE health_data ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), blood_pressure VARCHAR(20), heart_rate INT, blood_sugar FLOAT, weight FLOAT, steps INT, timestamp VARCHAR(20) );插入数据:
INSERT INTO health_data (name, blood_pressure, heart_rate, blood_sugar, weight, steps, timestamp) VALUES ('张三', '120/80', 70, 5.5, 70.5, 10000, '2025-05-10 10:00:00');查询数据:
SELECT * FROM health_data; SELECT name, heart_rate FROM health_data WHERE heart_rate > 80;更新数据:
UPDATE health_data SET heart_rate = 75 WHERE id = 1;删除数据:
DELETE FROM health_data WHERE id = 1; DELETE FROM health_data; -- 清空表
1.4 Navicat
Navicat是可视化MySQL客户端:
功能:创建数据库/表,执行SQL,导入/导出数据。
优势:图形界面,适合初学者,调试方便。
与宝塔集成:Navicat可连接阿里云MySQL。
1.5 健康数据数据库目标
创建
health_db数据库,包含health_data表。支持API操作:插入(POST)、查询(GET)、清空(DELETE)。
用Navicat管理本地和阿里云数据库。
学时2:演示课 - 用Navicat搭建数据库并集成API
2.1 目标
老师展示:
用Navicat创建
health_db和health_data表。连接Flask API,测试插入、查询、清空。
验证前端交互(
index.html)。
2.2 代码和操作
现有代码(参考后端教材)
PyCharm项目:
HealthAPI(app.py,config.py)。config.py:
MYSQL_CONFIG = { 'host': 'localhost', 'user': 'root', 'password': 'your_mysql_password', # 替换为本地MySQL密码 'database': 'health_db' }app.py:保持不变(见后端教材)。
index.html:保持不变(前端通过
http://localhost:5000/api/health交互)。
Navicat操作
安装Navicat:
下载Navicat for MySQL,安装并启动。
连接本地MySQL:
打开Navicat,点击“连接” > “MySQL”。
配置:
连接名:
LocalMySQL主机:
localhost用户名:
root密码:你的MySQL密码
测试连接,成功后保存。
创建数据库:
右键“连接” > “新建数据库”,名称:
health_db。
创建表:
打开
health_db,点击“表” > “新建表”。添加字段(图形界面):
id: INT, 主键,自动递增name: VARCHAR(50)blood_pressure: VARCHAR(20)heart_rate: INTblood_sugar: FLOATweight: FLOATsteps: INTtimestamp: VARCHAR(20)
保存,表名:
health_data。
插入测试数据:
打开
health_data表,点击“+”添加记录:name: 张三
blood_pressure: 120/80
heart_rate: 70
blood_sugar: 5.5
weight: 70.5
steps: 10000
timestamp: 2025-05-10 10:00:00
运行API:
在PyCharm,运行
app.py(右键 > Run)。Chrome访问
http://localhost:5000/api/health,应看到:[{"id": 1, "name": "张三", "blood_pressure": "120/80", ...}]
测试前端:
打开
index.html(Live Server)。查看表格(显示张三数据)。
添加新数据(李四,120/80, 75, 6.0, 65.0, 8000),点击“添加”。
在Navicat刷新
health_data,确认新记录。点击“清空表格”,Navicat确认表为空。
调试提示:
Navicat连接失败:检查MySQL服务(
mysql -u root -p),密码正确。API无数据:确认
config.py密码,Navicat检查health_db是否有表。前端错误:Chrome F12“Network”检查API状态。
学时3-4:实践课 - 优化数据库并连接阿里云
3.1 目标
用Navicat执行高级查询和表优化。
添加索引和触发器。
连接阿里云MySQL(宝塔面板),集成API。
3.2 准备工作
本地环境:
PyCharm“HealthAPI”项目(
app.py,config.py)。Navicat连接本地MySQL,
health_db可用。前端
index.html配置正确。
阿里云:
登录宝塔:
http://<公网IP>:8888。确认MySQL、Nginx、Python项目管理器已安装。
起点:
复制
app.py为my_app.py,config.py为my_config.py。Navicat备份
health_db(右键 > 导出)。
3.3 任务分解
任务1:高级查询
目标:用Navicat查询高心率(>80)和最近数据。
操作:
打开Navicat,连接
LocalMySQL,进入health_db。点击“查询” > “新建查询”,输入:
SELECT * FROM health_data WHERE heart_rate > 80;运行,查看结果。
新查询:
SELECT * FROM health_data ORDER BY timestamp DESC LIMIT 5;运行,查看最近5条记录。
在PyCharm,修改
my_app.py,添加端点:@app.route('/api/health/high_heart_rate', methods=['GET']) def get_high_heart_rate(): conn = get_db_connection() if not conn: return jsonify({'error': '数据库连接失败'}), 500 cursor = conn.cursor(dictionary=True) cursor.execute('SELECT * FROM health_data WHERE heart_rate > 80') rows = cursor.fetchall() cursor.close() conn.close() return jsonify(rows)测试:Chrome访问
http://localhost:5000/api/health/high_heart_rate。
任务2:优化表结构
目标:添加索引,创建触发器记录插入时间。
操作:
索引:
在Navicat,打开
health_data表设计。点击“索引”,添加索引:
名称:
idx_name字段:
name
保存,提升查询效率。
触发器:
点击“触发器” > “新建触发器”。
名称:
set_timestamp时机:Before Insert
语句:
SET NEW.timestamp = NOW();保存,自动设置插入时间。
更新
my_app.py,移除手动设置timestamp:# 在 add_health_data() 中 # 删除 timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S') cursor.execute('''INSERT INTO health_data (name, blood_pressure, heart_rate, blood_sugar, weight, steps) VALUES (%s, %s, %s, %s, %s, %s)''', (name, blood_pressure, heart_rate, blood_sugar, weight, steps))测试:用前端添加数据,Navicat检查
timestamp自动生成。
任务3:连接阿里云MySQL
目标:用Navicat连接宝塔MySQL,部署API和前端。
操作:
宝塔配置MySQL:
登录宝塔,导航“数据库” > “添加数据库”。
名称:
health_db,用户:health_user,密码:Health123!。记录凭据。
Navicat连接阿里云:
新建连接:
连接名:
AliyunMySQL主机:
<公网IP>用户名:
health_user密码:
Health123!
测试连接(确保宝塔“安全”开放3306端口)。
创建
health_data表(同本地,复制SQL或用Navicat设计)。
部署API:
更新
my_config.py:MYSQL_CONFIG = { 'host': '<公网IP>', 'user': 'health_user', 'password': 'Health123!', 'database': 'health_db' }上传
my_app.py,my_config.py,requirements.txt到宝塔/www/wwwroot/health_api(PyCharm SFTP)。宝塔“Python项目管理器”:
添加项目:路径
/www/wwwroot/health_api,启动文件my_app.py,端口5000。安装依赖,启动项目。
部署前端:
上传
index.html到/www/wwwroot/health_api。宝塔“网站” > “添加站点”:
根目录:
/www/wwwroot/health_api端口:80
首页:
index.html
更新
index.html,API地址为http://<公网IP>:5000。
测试:
访问
http://<公网IP>,测试前端。添加数据,Navicat(AliyunMySQL)检查
health_data。访问
http://<公网IP>:5000/api/health/high_heart_rate。
调试提示:
Navicat连接阿里云失败:检查宝塔3306端口,凭据正确。
API错误:宝塔“Python项目管理器”日志。
前端无数据:Chrome F12“Network”,确认API地址。
3.4 完整代码(参考)
my_config.py
MYSQL_CONFIG = {
'host': '<公网IP>', # 本地测试用 'localhost'
'user': 'health_user',
'password': 'Health123!',
'database': 'health_db'
}
my_app.py
from flask import Flask, jsonify, request
from flask_cors import CORS
import mysql.connector
from mysql.connector import Error
import config
app = Flask(__name__)
CORS(app)
def get_db_connection():
try:
conn = mysql.connector.connect(**config.MYSQL_CONFIG)
return conn
except Error as e:
print(f"数据库连接错误: {e}")
return None
def init_db():
conn = get_db_connection()
if conn:
cursor = conn.cursor()
cursor.execute('''CREATE TABLE IF NOT EXISTS health_data (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
blood_pressure VARCHAR(20),
heart_rate INT,
blood_sugar FLOAT,
weight FLOAT,
steps INT,
timestamp VARCHAR(20)
)''')
conn.commit()
cursor.close()
conn.close()
@app.route('/api/health', methods=['GET'])
def get_health_data():
conn = get_db_connection()
if not conn:
return jsonify({'error': '数据库连接失败'}), 500
cursor = conn.cursor(dictionary=True)
name = request.args.get('name')
if name:
cursor.execute('SELECT * FROM health_data WHERE name = %s', (name,))
else:
cursor.execute('SELECT * FROM health_data')
rows = cursor.fetchall()
cursor.close()
conn.close()
return jsonify(rows)
@app.route('/api/health/high_heart_rate', methods=['GET'])
def get_high_heart_rate():
conn = get_db_connection()
if not conn:
return jsonify({'error': '数据库连接失败'}), 500
cursor = conn.cursor(dictionary=True)
cursor.execute('SELECT * FROM health_data WHERE heart_rate > 80')
rows = cursor.fetchall()
cursor.close()
conn.close()
return jsonify(rows)
@app.route('/api/health', methods=['POST'])
def add_health_data():
data = request.get_json()
name = data.get('name')
blood_pressure = data.get('blood_pressure')
heart_rate = data.get('heart_rate')
blood_sugar = data.get('blood_sugar')
weight = data.get('weight')
steps = data.get('steps')
if not all([name, blood_pressure, heart_rate, blood_sugar, weight, steps]):
return jsonify({'error': '所有字段必须填写'}), 400
try:
heart_rate = int(heart_rate)
blood_sugar = float(blood_sugar)
weight = float(weight)
steps = int(steps)
if not (50 <= heart_rate <= 120):
return jsonify({'error': '心率必须在50-120之间'}), 400
if not (0 <= blood_sugar <= 20):
return jsonify({'error': '血糖必须在0-20之间'}), 400
if not (30 <= weight <= 200):
return jsonify({'error': '体重必须在30-200之间'}), 400
if not (0 <= steps <= 50000):
return jsonify({'error': '步数必须在0-50000之间'}), 400
except ValueError:
return jsonify({'error': '心率、血糖、体重、步数必须是有效数字'}), 400
conn = get_db_connection()
if not conn:
return jsonify({'error': '数据库连接失败'}), 500
cursor = conn.cursor()
cursor.execute('''INSERT INTO health_data (name, blood_pressure, heart_rate, blood_sugar, weight, steps)
VALUES (%s, %s, %s, %s, %s, %s)''',
(name, blood_pressure, heart_rate, blood_sugar, weight, steps))
conn.commit()
cursor.close()
conn.close()
return jsonify({'message': '数据添加成功'}), 201
@app.route('/api/health', methods=['DELETE'])
def clear_health_data():
conn = get_db_connection()
if not conn:
return jsonify({'error': '数据库连接失败'}), 500
cursor = conn.cursor()
cursor.execute('DELETE FROM health_data')
conn.commit()
cursor.close()
conn.close()
return jsonify({'message': '数据已清空'}), 200
if __name__ == '__main__':
init_db()
app.run(debug=True)
3.5 提交要求
保存
my_app.py,my_config.py,index.html,上传到宝塔/www/wwwroot/health_api。提交公网IP,访问
http://<公网IP>(前端),http://<公网IP>:5000/api/health(API)。Navicat截图:
health_data表、查询结果。个性化:
添加查询端点:
/api/health/recent(最近5条)。Navicat导出CSV,分析数据。
3.6 时间安排
学时3(1小时):
30分钟:任务1(高级查询),测试API端点。
30分钟:任务2(索引、触发器),验证。
学时4(1小时):
30分钟:任务3(阿里云MySQL连接),部署API。
30分钟:测试公网访问,优化。
小贴士
Navicat:
连接失败:检查主机、端口、凭据。
查询慢:添加索引(如
name)。备份:定期导出
health_db。
阿里云:
端口:宝塔“安全”开放3306、5000、80。
日志:宝塔“Python项目管理器”或“数据库”查看。
调试:
API失败:Navicat确认表数据,PyCharm终端日志。
前端错误:Chrome F12“Network”。
创意:
Navicat设计视图,添加字段(如
note)。API支持分页查询(
LIMIT,OFFSET)。
健康数据意义:
数据库支持医生分析老年人健康趋势。
未来可添加异常检测(如高血糖报警)。
最后编辑:信息技术教研室 更新时间:2025-08-13 10:53