MySQL 数据库集成
概述
云托管提供了多种方式连接和操作 MySQL 数据库,满足不同场景下的应用需求。本文档将详细介绍以下几种连接方式:
连接方式 | 适用场景 | 优势 |
---|---|---|
云开发 MySQL 数据库 | 同一云开发环境内的应用 | 内网直连,安全高效 |
公网连接 | 连接任意可公网访问的 MySQL 实例 | 灵活性高,适用范围广 |
内网互联 | 连接腾讯云上海区域的 MySQL 实例 | 安全性高,性能好 |
数据模型 OpenAPI | 需要高级数据模型功能的应用 | 简化数据操作,提供权限控制 |
注意:本文示例基于Express 应用框架构建,您可以根据自己的技术栈选择相应的数据库驱动和连接方式。
连接云开发 MySQL 数据库
开通云开发 MySQL 云数据库
- 登录腾讯云开发控制台,进入您的云开发环境
- 在左侧导航栏选择数据库 > MySQL数据库
- 选择数据库管理选项卡
- 根据您的情况选择:
- 已有数据模型:如直连数据库能力未开通,需升级和迁移数据库后才可提供,可提交工单,技术支持人员将协助您升级数据库
- 首次使用:系统将提示您初始化新的数据库
- 选择所需的 MySQL 版本
- 设置数据库管理员密码(请妥善保存)
- 点击确认,等待数据库初始化完成
- 初始化完成后,在数据库管理页面可以查看数据库的连接信息,包括:
- 内网连接地址
- 端口
- 用户名
在云托管服务中使用云开发 MySQL 云数据库
云托管服务可以直接通过内网地址连接云开发 MySQL 数据库,无需额外配置:
- 获取云开发 MySQL 数据库的连接信息(内网地址、端口、用户名和密码)
- 在云托管服务的环境变量中配置这些连接信息
- 使用下文通过公网连接数据库章节中的代码示例,将连接参数替换为云开发 MySQL 数据库的内网连接信息
优势:内网连接速度快、安全性高,无需暴露数据库到公网
通过公网连接数据库
准备工作
- 确保您的 MySQL 数据库已开启公网访问,并设置了合适的访问控制规则
- 准备好数据库连接信息(主机地址、端口、用户名、密码、数据库名)
实现步骤
1. 创建数据库和表
首先,在您的 MySQL 数据库中创建一个名为 express_dev
的数据库,并创建用户表:
CREATE DATABASE IF NOT EXISTS express_dev;
USE express_dev;
CREATE TABLE persons (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
age INT NOT NULL
);
-- 可选:插入一些测试数据
INSERT INTO persons (name, age) VALUES ('张三', 25), ('李四', 30), ('王五', 35);
表结构说明:
id
:自增主键,唯一标识每条记录name
:人名,VARCHAR 类型,最长 100 个字符,不允许为空age
:年龄,INT 类型,不允许为空
2. 安装数据库驱动
在您的 Express 项目中安装 MySQL 驱动:
npm install mysql2 --save
推荐使用
mysql2
而非mysql
,因为前者支持 Promise API 和更好的性能
3. 编写数据库连接代码
打开 routes/index.js
文件,修改为以下内容:
const express = require('express');
const mysql = require('mysql2/promise');
const router = express.Router();
// 创建 MySQL 连接池
const pool = mysql.createPool({
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
port: process.env.DB_PORT ? Number(process.env.DB_PORT) : 3306,
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0
});
/* GET home page. */
router.get('/', async function(req, res, next) {
try {
const connection = await pool.getConnection();
try {
const [rows] = await connection.query('SELECT * FROM persons LIMIT 10');
res.json({ success: true, data: rows });
} finally {
// 确保连接返回到池中
connection.release();
}
} catch (err) {
console.error('数据库查询错误:', err);
res.status(500).json({ success: false, error: '数据库查询失败' });
}
});
module.exports = router;
4. 配置环境变量并部署
在云托管服务中配置以下环境变量:
环境变量 | 说明 | 示例值 |
---|---|---|
DB_HOST | 数据库主机地址 | mysql-example.mysql.database.tencentcloud.com |
DB_USER | 数据库用户名 | root |
DB_PASSWORD | 数据库密码 | your_password |
DB_NAME | 数据库名称 | express_dev |
DB_PORT | 数据库端口 | 3306 |
安全提示:敏感信息如数据库密码应使用云托管的环境变量功能存储,避免硬编码在代码中
5. 测试连接
部署完成后,访问云托管服务的根路径,如果一切正常,您将看到从数据库中查询的用户数据。
通过内网互联连接腾讯云数据库
适用场景
该方式适用于连接在腾讯云上海区域购买的 MySQL 数据库实例,通过内网互联可以实现更高效、更安全的数据库访问。
配置步骤
购买腾讯云 MySQL 实例
- 登录腾讯云控制台
- 选择云数据库 MySQL服务
- 购买时选择上海地域
- 完成购买并初始化数据库
配置内网互联
- 在云托管控制台中,选择网络配置 > 内网互联
- 点击配置 VPC 连接
- 选择目标 VPC 网络(您的 MySQL 实例所在的 VPC)
- 保存配置
使用内网地址连接
- 获取 MySQL 实例的内网地址(可在腾讯云 MySQL 控制台查看)
- 在云托管服务的环境变量中配置数据库连接信息,使用内网地址
- 使用与公网连接相同的代码,但连接地址改为内网地址
优势
- 安全性:数据库流量不经过公网,降低安全风险
- 性能:内网连接延迟低,吞吐量高
- 成本:避免公网流量费用
注意:内网互联功能仅支持连接同一账号、同一地域的资源。如需跨地域连接,请考虑使用公网连接方式。
通过数据模型 OpenAPI 操作数据库
数据模型 OpenAPI 提供了一种更高级的方式来操作数据库,它封装了底层的数据库操作,提供了权限控制、数据验证等功能。
相关资源
实现步骤
1. 创建数据模型
- 登录云开发控制台
- 点击创建数据模型,配置如下:
- 创建模式:创建数据库并配置数据模型
- 创建方式:从空白创建
- 写入到数据库:云数据库(MySQL 型)
- 模型名称:用户
- 模型标识:users
- 添加字段:
- 字段 1:
- 字段名称:姓名
- 字段标识:name
- 类型:文本类型
- 字段 2:
- 字段名称:年龄
- 字段标识:age
- 类型:数字
- 字段 1:
- 点击确认完成创建
2. 创建用户并授权
- 进入腾讯云开发 > 扩展能力 > 云后台管理
- 选择用户管理 > 创建用户,填写用户信息并创建
- 选择权限控制 > 系统角色 > 超级管理员 > 添加成员
- 将刚才创建的用户添加为超级管理员
3. 创建 Express 路由处理数据模型 API 调用
- 安装必要的依赖:
npm install axios express --save
- 在
routes
目录下创建users.js
:
const express = require("express");
const router = express.Router();
const axios = require("axios");
// 从环境变量读取配置
const envId = process.env.ENV_ID;
const username = process.env.USERNAME;
const password = process.env.PASSWORD;
const modelName = process.env.MODEL_NAME || "users";
// 用户登录获取 token
async function signin(envId, username, password) {
const url = `https://${envId}.api.tcloudbasegateway.com/auth/v1/signin`;
try {
const response = await axios.post(
url,
{ username, password, verification_token: "" },
{
headers: {
"Content-Type": "application/json",
Accept: "application/json",
},
}
);
const data = response.data;
if (!data.token_type || !data.access_token) {
throw new Error("返回数据缺少 token_type 或 access_token");
}
return `${data.token_type} ${data.access_token}`;
} catch (error) {
console.error("登录失败:", error.response?.data || error.message);
throw error.response?.data || error;
}
}
// 获取数据模型列表
async function getModelList(envId, modelName, token) {
const url = `https://${envId}.api.tcloudbasegateway.com/v1/model/prod/${encodeURIComponent(
modelName
)}/list`;
try {
const response = await axios.get(url, {
headers: {
Accept: "application/json",
Authorization: token,
},
});
return response.data.data;
} catch (error) {
console.error("获取模型列表失败:", error.response?.data || error.message);
throw error.response?.data || error;
}
}
// 获取用户列表路由
router.get("/", async (req, res) => {
if (!envId || !username || !password) {
return res.status(400).json({ success: false, error: "缺少必要的环境变量配置" });
}
try {
// 先登录获取 token
const token = await signin(envId, username, password);
// 使用 token 获取模型列表
const data = await getModelList(envId, modelName, token);
res.json({ success: true, data });
} catch (err) {
res.status(500).json({ success: false, error: err.message || "未知错误" });
}
});
module.exports = router;
- 在主应用文件
app.js
中注册路由:
const usersRouter = require('./routes/users');
app.use('/api/users', usersRouter);
4. 配置环境变量
在云托管服务中配置以下环境变量:
环境变量 | 说明 | 示例值 |
---|---|---|
ENV_ID | 云开发环境 ID | your-env-id |
USERNAME | 已创建的用户名 | admin |
PASSWORD | 用户密码 | your-password |
MODEL_NAME | 数据模型标识 | users |
5. 部署和测试
- 部署应用到云托管
- 访问
/api/users
端点,如果配置正确,将返回数据模型中的用户列表
数据模型 API 的优势
- 权限控制:基于角色的访问控制
- 数据验证:自动验证数据格式和类型
- 简化开发:无需编写复杂的 SQL 查询
- 统一接口:标准化的 RESTful API
最佳实践
连接池管理
- 使用连接池而非单一连接,提高性能和可靠性
- 合理设置连接池大小,通常为
容器实例数 × 5-10
- 确保正确释放连接,避免连接泄漏
安全性
- 使用环境变量存储敏感信息,避免硬编码
- 为数据库用户设置最小权限
- 定期更新数据库密码
- 使用参数化查询防止 SQL 注入
性能优化
- 为频繁查询的字段创建索引
- 优化查询语句,避免全表扫描
- 使用适当的数据类型和表结构
- 考虑使用读写分离提高性能
错误处理
- 实现完善的错误处理和日志记录
- 设置连接超时和重试机制
- 监控数据库连接状态和性能指标
常见问题排查
问题 | 可能原因 | 解决方案 |
---|---|---|
连接超时 | 网络问题或数据库负载高 | 检查网络配置,增加连接超时时间 |
连接数过多 | 连接未正确释放或连接池配置不当 | 确保释放连接,调整连接池大小 |
认证失败 | 用户名或密码错误 | 检查环境变量配置是否正确 |
查询性能差 | 缺少索引或查询未优化 | 添加适当的索引,优化查询语句 |