这两天把数据库环境彻底理顺了:3306留给学校作业,3307专供无人机项目,换了Navicat 16,最后用
mysql2把后端和数据库连了起来。
一、为什么要折腾3307端口?
学校作业用的MySQL跑在3306(小皮管理),如果直接在3306里建 drone_platform 库,作业和项目数据会混在一起。3307端口是复制出来的独立MySQL实例,数据存在单独的 MySQL5.7.26_3307/data 文件夹,两套环境完全隔离。
效果:
- 3306(作业库)和3307(项目库)互不干扰
- 小皮崩了不影响项目数据
- 项目代码里固定连3307,不用改来改去
坑与解决:
- 复制MySQL文件夹后需要改
my.ini里的端口和数据目录 - 初始化新数据目录用
mysqld --initialize-insecure - 注册Windows服务:
mysqld --install MySQL_3307 --defaults-file="...my.ini" - 服务启动:
net start MySQL_3307
二、Navicat 16 安装 + 脚本重置(不用补丁)
Navicat 16.3 下载链接来自官方服务器:
text
https://download.navicat.com.cn/download/navicat163_premium_cs_x64.exe
为什么不用17?
17的Windows重置脚本不够稳定,16社区验证充分,一次配置长期省心。
Navicat Premium 16 支持 14 天全功能试用。
为了延续试用状态,可以通过清理注册表中的试用记录来实现。
具体方法:创建 .bat 脚本,执行 reg delete 命令删除 HKEY_CURRENT_USER\Software\PremiumSoft\NavicatPremium 键值,重新打开后试用期恢复为 14 天。
三、Node.js 连接 MySQL
安装 mysql2
bash
npm install mysql2
连接代码 db.js
javascript
const mysql = require('mysql2');
const connection = mysql.createConnection({
host: 'localhost',
port: 3307, // 项目专用数据库
user: 'root',
password:'your_password', // 填写自己端口号密码
database: 'drone_platform'
});
connection.connect((err) => {
if (err) {
console.error('❌ 连接失败:', err.message);
return;
}
console.log('✅ 数据库连接成功!');
});
// 插入测试数据
connection.query("INSERT INTO users (name) VALUES ('无人机1')", (err, result) => {
if (!err) console.log('✅ 插入成功,id:', result.insertId);
});
// 查询数据
connection.query("SELECT * FROM users", (err, results) => {
if (!err) console.log('📋 users表数据:', results);
});
connection.end();
关于代码理解点:
connection.query() 是 mysql2 包提供的方法
作用就是:把 SQL 语句发给 MySQL,MySQL 执行完后把结果返回。
query 就是 JS 和 MySQL 之间的“翻译官”。
运行
bash
node db.js
输出示例
text
✅ 数据库连接成功!
✅ 插入成功,id:1
📋 users表数据: [ { id: 1, name: '测试飞手' } ]
四、今天踩的坑 & 解决
| 坑 | 原因 | 解决 |
|---|---|---|
| Navicat看不到数据库 | 没在高级选项卡指定数据库名 | 填写 drone_platform |
| CMD找不到mysql命令 | 环境变量没配 | 用 cd 进bin目录再执行 |
mysql2 装不上 | 在系统CMD而非VS Code终端运行 | 切换到VS Code终端 |
| 重复插入多条数据 | 用 nodemon 跑脚本,每次保存重复执行 | 改用 node db.js |
| 3307服务未启动 | 重启电脑后服务没自动跑 | net start MySQL_3307 |
五、核心理解
- 数据不在Navicat里:数据存在MySQL的数据目录,Navicat只是查看工具,换版本不影响数据。
- 3307不会白折腾:本地开发用3307,将来部署云端只需改
.env里的端口,不影响代码逻辑。 query是JS和MySQL的翻译官:JS把SQL字符串发给MySQL,MySQL执行后返回结果。- id自增是MySQL设置的:建表时的
AUTO_INCREMENT,不用JS手动管理。 - 占位符
?用来防SQL注入:现阶段写固定值不涉及安全问题,以后写动态接口时再换。