跳到主要内容

MySQL 数据库集成

概述

云托管提供了多种方式连接和操作 MySQL 数据库,满足不同场景下的应用需求。本文档将详细介绍以下几种连接方式:

连接方式适用场景优势
云开发 MySQL 数据库同一云开发环境内的应用内网直连,安全高效
公网连接连接任意可公网访问的 MySQL 实例灵活性高,适用范围广
内网互联连接腾讯云上海区域的 MySQL 实例安全性高,性能好
数据模型 OpenAPI需要高级数据模型功能的应用简化数据操作,提供权限控制

注意:本文示例基于Express 应用框架构建,您可以根据自己的技术栈选择相应的数据库驱动和连接方式。

连接云开发 MySQL 数据库

开通云开发 MySQL 云数据库

  1. 登录腾讯云开发控制台,进入您的云开发环境
  2. 在左侧导航栏选择数据库 > MySQL数据库
  3. 选择数据库管理选项卡
  4. 根据您的情况选择:
    • 已有数据模型:如直连数据库能力未开通,需升级和迁移数据库后才可提供,可提交工单,技术支持人员将协助您升级数据库
    • 首次使用:系统将提示您初始化新的数据库
      • 选择所需的 MySQL 版本
      • 设置数据库管理员密码(请妥善保存)
      • 点击确认,等待数据库初始化完成
  5. 初始化完成后,在数据库管理页面可以查看数据库的连接信息,包括:
    • 内网连接地址
    • 端口
    • 用户名

在云托管服务中使用云开发 MySQL 云数据库

云托管服务可以直接通过内网地址连接云开发 MySQL 数据库,无需额外配置:

  1. 获取云开发 MySQL 数据库的连接信息(内网地址、端口、用户名和密码)
  2. 在云托管服务的环境变量中配置这些连接信息
  3. 使用下文通过公网连接数据库章节中的代码示例,将连接参数替换为云开发 MySQL 数据库的内网连接信息

优势:内网连接速度快、安全性高,无需暴露数据库到公网

通过公网连接数据库

准备工作

  1. 确保您的 MySQL 数据库已开启公网访问,并设置了合适的访问控制规则
  2. 准备好数据库连接信息(主机地址、端口、用户名、密码、数据库名)

实现步骤

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 数据库实例,通过内网互联可以实现更高效、更安全的数据库访问。

配置步骤

  1. 购买腾讯云 MySQL 实例

    • 登录腾讯云控制台
    • 选择云数据库 MySQL服务
    • 购买时选择上海地域
    • 完成购买并初始化数据库
  2. 配置内网互联

    • 在云托管控制台中,选择网络配置 > 内网互联
    • 点击配置 VPC 连接
    • 选择目标 VPC 网络(您的 MySQL 实例所在的 VPC)
    • 保存配置
  3. 使用内网地址连接

    • 获取 MySQL 实例的内网地址(可在腾讯云 MySQL 控制台查看)
    • 在云托管服务的环境变量中配置数据库连接信息,使用内网地址
    • 使用与公网连接相同的代码,但连接地址改为内网地址

优势

  • 安全性:数据库流量不经过公网,降低安全风险
  • 性能:内网连接延迟低,吞吐量高
  • 成本:避免公网流量费用

注意:内网互联功能仅支持连接同一账号、同一地域的资源。如需跨地域连接,请考虑使用公网连接方式。

通过数据模型 OpenAPI 操作数据库

数据模型 OpenAPI 提供了一种更高级的方式来操作数据库,它封装了底层的数据库操作,提供了权限控制、数据验证等功能。

相关资源

实现步骤

1. 创建数据模型

  1. 登录云开发控制台
  2. 点击创建数据模型,配置如下:
    • 创建模式:创建数据库并配置数据模型
    • 创建方式:从空白创建
    • 写入到数据库:云数据库(MySQL 型)
    • 模型名称:用户
    • 模型标识:users
  3. 添加字段:
    • 字段 1:
      • 字段名称:姓名
      • 字段标识:name
      • 类型:文本类型
    • 字段 2:
      • 字段名称:年龄
      • 字段标识:age
      • 类型:数字
  4. 点击确认完成创建

2. 创建用户并授权

  1. 进入腾讯云开发 > 扩展能力 > 云后台管理
  2. 选择用户管理 > 创建用户,填写用户信息并创建
  3. 选择权限控制 > 系统角色 > 超级管理员 > 添加成员
  4. 将刚才创建的用户添加为超级管理员

3. 创建 Express 路由处理数据模型 API 调用

  1. 安装必要的依赖:
npm install axios express --save
  1. 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;
  1. 在主应用文件 app.js 中注册路由:
const usersRouter = require('./routes/users');
app.use('/api/users', usersRouter);

4. 配置环境变量

在云托管服务中配置以下环境变量:

环境变量说明示例值
ENV_ID云开发环境 IDyour-env-id
USERNAME已创建的用户名admin
PASSWORD用户密码your-password
MODEL_NAME数据模型标识users

5. 部署和测试

  1. 部署应用到云托管
  2. 访问 /api/users 端点,如果配置正确,将返回数据模型中的用户列表

数据模型 API 的优势

  • 权限控制:基于角色的访问控制
  • 数据验证:自动验证数据格式和类型
  • 简化开发:无需编写复杂的 SQL 查询
  • 统一接口:标准化的 RESTful API

最佳实践

连接池管理

  • 使用连接池而非单一连接,提高性能和可靠性
  • 合理设置连接池大小,通常为 容器实例数 × 5-10
  • 确保正确释放连接,避免连接泄漏

安全性

  • 使用环境变量存储敏感信息,避免硬编码
  • 为数据库用户设置最小权限
  • 定期更新数据库密码
  • 使用参数化查询防止 SQL 注入

性能优化

  • 为频繁查询的字段创建索引
  • 优化查询语句,避免全表扫描
  • 使用适当的数据类型和表结构
  • 考虑使用读写分离提高性能

错误处理

  • 实现完善的错误处理和日志记录
  • 设置连接超时和重试机制
  • 监控数据库连接状态和性能指标

常见问题排查

问题可能原因解决方案
连接超时网络问题或数据库负载高检查网络配置,增加连接超时时间
连接数过多连接未正确释放或连接池配置不当确保释放连接,调整连接池大小
认证失败用户名或密码错误检查环境变量配置是否正确
查询性能差缺少索引或查询未优化添加适当的索引,优化查询语句