简介:本文详解如何免费使用PlanetScale云数据库搭配Vercel部署应用,涵盖从注册到数据库操作的全流程,助开发者零成本搭建MySQL环境。
Vercel作为全球领先的Serverless部署平台,凭借其”零配置”的CI/CD流程和全球CDN加速,已成为Next.js等现代框架的首选部署方案。而PlanetScale作为基于Vitess的Serverless MySQL数据库,其架构设计天然适配Serverless应用场景。两者结合可实现:
对比传统方案:
| 方案 | 数据库成本 | 部署成本 | 运维复杂度 |
|———|——————|—————|——————|
| 传统VPS | $5/月起 | $5/月起 | 中等 |
| AWS RDS | $0.015/小时 | 免费层有限 | 高 |
| PlanetScale+Vercel | 免费层充足 | 免费层充足 | 极低 |
PlanetScale的免费层提供:
PlanetScale的分支功能是其核心优势:
# 通过CLI创建开发分支(需先安装planetscale CLI)pscale branch create mydb dev-branch --database mydb# 查看分支状态pscale branch list mydb
分支特性:
pscale branch promote可快速将分支提升为主库获取连接字符串的三种方式:
Vercel集成:
手动配置:
// Next.js示例(.env.local)DATABASE_URL="mysql://user:pass@host/dbname?ssl_mode=REQUIRED"
Prisma适配:
// schema.prismadatasource db {provider = "mysql"url = env("DATABASE_URL")shadowDatabaseUrl = env("SHADOW_DATABASE_URL") // 用于迁移测试}
PlanetScale原生支持无损schema变更:
# 1. 安装迁移工具npm install -g @planetscale/cli# 2. 生成迁移文件pscale schema generate mydb dev-branch > migration.sql# 3. 应用迁移pscale schema apply mydb dev-branch --file migration.sql
在Vercel项目设置中:
DATABASE_URL环境变量(从PlanetScale的Connect页面获取)
// 使用mysql2/promise的优化配置const pool = createPool({host: process.env.DB_HOST,user: process.env.DB_USER,password: process.env.DB_PASSWORD,database: process.env.DB_NAME,waitForConnections: true,connectionLimit: 10, // Vercel实例通常5-10个连接足够queueLimit: 0,ssl: { rejectUnauthorized: true }});
在vercel.json中配置:
{"build": {"env": {"NODE_ENV": "production"}},"hooks": {"after-deploy": "curl -X POST https://api.planetscale.com/v1/databases/{db}/branches/{branch}/deploy-requests"}}
PlanetScale自动处理:
// 连接时指定readReplica参数const connection = mysql.createConnection({host: 'primary.region.planetscale.com',readReplicaHost: 'replica.region.planetscale.com',// ...其他参数});
在PlanetScale Dashboard设置:
pscale dump mydb main --output=backup.sql
ETIMEDOUT错误
// 增加连接超时时间const connection = mysql.createConnection({timeout: 30000, // 30秒// ...其他参数});
# 在Linux服务器上安装CA证书sudo apt-get install ca-certificates
pscale schema diff mydb branch1 branch2--execute参数自动生成合并脚本
ALTER TABLE users ADD INDEX idx_email (email);
// 使用连接池的getConnection方法async function queryDb(sql) {const connection = await pool.getConnection();try {const [rows] = await connection.query(sql);return rows;} finally {connection.release();}}
当项目规模扩大时:
通过这种渐进式升级策略,开发者可以在保持架构一致性的同时,根据业务需求灵活扩展。PlanetScale+Vercel的组合不仅适用于个人项目,对于中小型企业的MVP开发同样具有极高的性价比。
(全文约3200字,涵盖从基础配置到高级优化的完整解决方案)