名称:neon-vercel-postgres 描述:Neon + Vercel 无服务器 PostgreSQL,适用于边缘和无服务器环境。用于 Cloudflare Workers、Vercel Edge、带 HTTP/WebSocket 连接的 Next.js 应用、数据库分支(类似 git)、Drizzle/Prisma ORM 集成、迁移、PITR 备份,或遇到连接池耗尽错误、TCP 连接问题、SSL 配置问题。 关键词:
- neon postgres
- “@neondatabase/serverless”
- “@vercel/postgres”
- 无服务器 postgres
- postgres 边缘
- neon 分支
- vercel 数据库
- http postgres
- websocket postgres
- 池化连接
- drizzle neon
- prisma neon
- postgres cloudflare
- postgres vercel edge
- sql 模板标签
- neonctl
- 数据库分支
- 时间点恢复
- postgres 迁移
- 无服务器 sql
- 边缘数据库
- neon api
- vercel sql 许可证:MIT 元数据: 版本:“2.0.0” neon_serverless_version:“1.0.2” vercel_postgres_version:“0.10.0” drizzle_orm_version:“0.44.7” errors_prevented:15 templates_included:5 references_included:4
Neon & Vercel 无服务器 PostgreSQL
状态:生产就绪
最后更新:2025-11-21
依赖项:无
最新版本:@neondatabase/serverless@1.0.2, @vercel/postgres@0.10.0, drizzle-orm@0.44.7, neonctl@2.16.1
快速启动(5 分钟)
1. 选择您的平台
选项 A:Neon 直接(多云、Cloudflare Workers、任何无服务器)
bun add @neondatabase/serverless
选项 B:Vercel Postgres(仅 Vercel,在 Vercel 上零配置)
bun add @vercel/postgres
为什么重要:
- Neon 直接提供多云灵活性并访问分支 API
- Vercel Postgres 在 Vercel 上提供零配置,自动设置环境变量
- 两者都基于 HTTP(非 TCP),非常适合无服务器/边缘环境
2. 获取您的连接字符串
对于 Neon 直接:
# 在 https://neon.tech 注册
# 创建项目 → 获取连接字符串
# 格式:postgresql://user:password@ep-xyz-pooler.region.aws.neon.tech/dbname?sslmode=require
对于 Vercel Postgres:
# 在您的 Vercel 项目中
vercel postgres create
vercel env pull .env.local # 自动创建 POSTGRES_URL 和其他变量
关键:
- 为无服务器使用池化连接字符串(以
-pooler.region.aws.neon.tech结尾) - 非池化连接在无服务器环境中会快速耗尽
- 始终包含
?sslmode=require参数
3. 查询您的数据库
Neon 直接:
import { neon } from '@neondatabase/serverless';
const sql = neon(process.env.DATABASE_URL!);
// 简单查询
const users = await sql`SELECT * FROM users WHERE id = ${userId}`;
// 事务
const result = await sql.transaction([
sql`INSERT INTO users (name) VALUES (${name})`,
sql`SELECT * FROM users WHERE name = ${name}`
]);
Vercel Postgres:
import { sql } from '@vercel/postgres';
// 简单查询
const { rows } = await sql`SELECT * FROM users WHERE id = ${userId}`;
// 事务
const client = await sql.connect();
try {
await client.sql`BEGIN`;
await client.sql`INSERT INTO users (name) VALUES (${name})`;
await client.sql`COMMIT`;
} finally {
client.release();
}
关键:
- 使用模板标签语法(
sql`...`)进行自动 SQL 注入防护 - 永远不要拼接字符串:
sql('SELECT * FROM users WHERE id = ' + id)❌
关键规则
始终要做
✅ 使用池化连接字符串用于无服务器环境(主机名中以 -pooler. 结尾)
✅ 使用模板标签语法进行查询(sql`SELECT * FROM users`)以防止 SQL 注入
✅ 在连接字符串中包含 sslmode=require
✅ 事务后释放连接(Vercel Postgres 手动事务)
✅ 使用 Drizzle ORM用于边缘兼容的 TypeScript ORM(不在 Cloudflare Workers 中使用 Prisma)
✅ 将连接字符串设置为环境变量(永远不要硬编码)
✅ 使用 Neon 分支用于预览环境和测试
✅ 在 Neon 仪表板中监控连接池使用情况
✅ 使用 try/catch 块处理错误并在失败时回滚事务
✅ 在 INSERT/UPDATE 中使用 RETURNING 子句以在一次查询中获取创建/更新的数据
永远不要做
❌ 永远不要在无服务器函数中使用非池化连接(将耗尽连接池)
❌ 永远不要拼接 SQL 字符串('SELECT * FROM users WHERE id = ' + id)- SQL 注入风险
❌ 永远不要省略 sslmode=require - 连接将失败或不安全
❌ 永远不要忘记在手动 Vercel Postgres 事务中调用 client.release() - 连接泄漏
❌ 永远不要在 Cloudflare Workers 中使用 Prisma - 需要 Node.js 运行时(使用 Drizzle 代替)
❌ 永远不要硬编码连接字符串 - 使用环境变量
❌ 永远不要从边缘函数运行迁移 - 使用 Node.js 环境或 Neon 控制台
❌ 永远不要提交 .env 文件 - 添加到 .gitignore
❌ 永远不要在无服务器函数中使用 POSTGRES_URL_NON_POOLING - 破坏池化
❌ 永远不要超过连接限制 - 监控使用情况并在需要时升级计划
前 5 个错误(查看 references/error-catalog.md 获取所有 15 个)
错误 #1:连接池耗尽
错误:Error: connection pool exhausted 或 too many connections for role
解决方案:使用池化连接字符串(以 -pooler.region.aws.neon.tech 结尾),而不是非池化
错误 #2:不支持 TCP 连接
错误:Error: TCP connections are not supported in this environment
解决方案:使用 @neondatabase/serverless(基于 HTTP),而不是 pg 或 postgres.js(基于 TCP)
错误 #3:字符串拼接导致的 SQL 注入
错误:成功的 SQL 注入攻击
解决方案:始终使用模板标签(sql`SELECT * FROM users WHERE id = ${id}`),永远不要拼接字符串
错误 #4:缺少 SSL 模式
错误:Error: connection requires SSL
解决方案:始终在连接字符串后附加 ?sslmode=require
错误 #5:连接泄漏(Vercel Postgres)
错误:内存使用逐渐增加
解决方案:在手动事务的 finally 块中始终调用 client.release()
加载 references/error-catalog.md 获取所有 15 个错误的详细解决方案和故障排除指南。
常见用例
用例 1:Cloudflare Worker 与 Neon
当:在 Cloudflare Workers 上部署带 Postgres 的无服务器 API 快速模式:
import { neon } from '@neondatabase/serverless';
export default {
async fetch(request: Request, env: Env) {
const sql = neon(env.DATABASE_URL);
const users = await sql`SELECT * FROM users`;
return Response.json(users);
}
};
加载:references/common-patterns.md → 模式 1
用例 2:Next.js 服务器操作
当:使用 Vercel Postgres 构建 Next.js 应用 快速模式:
'use server';
import { sql } from '@vercel/postgres';
export async function getUsers() {
const { rows } = await sql`SELECT * FROM users`;
return rows;
}
加载:references/common-patterns.md → 模式 2
用例 3:使用 Drizzle 的类型安全查询
当:需要完整的 TypeScript 类型安全性和边缘兼容性
加载:references/common-patterns.md → 模式 3
用例 4:数据库事务
当:多个操作必须全部成功或全部失败(例如,资金转账)
加载:references/common-patterns.md → 模式 4
用例 5:带分支的预览环境
当:需要为每个拉取请求/预览部署隔离数据库
加载:references/common-patterns.md → 模式 5
何时加载参考
加载 references/setup-guide.md 当:
- 用户需要完整的 7 步设置过程
- 用户询问 Drizzle ORM 或 Prisma 集成
- 用户需要帮助环境变量或连接字符串
- 用户询问部署到 Cloudflare Workers 或 Vercel
加载 references/error-catalog.md 当:
- 遇到任何连接、查询或部署错误
- 用户报告“连接池耗尽”或超时错误
- 用户询问 SQL 注入预防
- 用户需要 Prisma 或 Drizzle 问题的故障排除
加载 references/common-patterns.md 当:
- 用户询问代码示例或模板
- 用户需要实现事务、分页或搜索
- 用户询问服务器操作、Cloudflare Workers 或 Drizzle 模式
- 用户想查看生产测试模式
加载 references/advanced-topics.md 当:
- 用户询问 Neon 分支或数据库工作流
- 用户需要连接池深入探讨
- 用户询问性能优化或查询调整
- 用户需要安全最佳实践(RLS、加密、审计日志)
- 用户询问备份或灾难恢复
配置文件参考
package.json(Neon 直接)
{
"dependencies": {
"@neondatabase/serverless": "^1.0.2"
}
}
package.json(Vercel Postgres)
{
"dependencies": {
"@vercel/postgres": "^0.10.0"
}
}
package.json(带 Drizzle ORM)
{
"dependencies": {
"@neondatabase/serverless": "^1.0.2",
"drizzle-orm": "^0.44.7"
},
"devDependencies": {
"drizzle-kit": "^0.31.0"
},
"scripts": {
"db:generate": "drizzle-kit generate",
"db:migrate": "drizzle-kit migrate",
"db:studio": "drizzle-kit studio"
}
}
drizzle.config.ts
import { defineConfig } from 'drizzle-kit';
export default defineConfig({
schema: './db/schema.ts',
out: './db/migrations',
dialect: 'postgresql',
dbCredentials: {
url: process.env.DATABASE_URL!
}
});
为什么这些设置:
@neondatabase/serverless是边缘兼容的(基于 HTTP/WebSocket)@vercel/postgres在 Vercel 上提供零配置drizzle-orm在所有运行时工作(Cloudflare Workers、Vercel Edge、Node.js)drizzle-kit处理迁移和模式生成
使用捆绑资源
模板(templates/)
drizzle-schema.ts - 完整的 Drizzle 模式,带用户、帖子、关系
// 查看 templates/drizzle-schema.ts 获取完整示例
drizzle-queries.ts - 常见查询模式(SELECT、INSERT、UPDATE、DELETE、连接)
// 查看 templates/drizzle-queries.ts 获取完整示例
drizzle-migrations-workflow.md - 完整的迁移工作流指南
// 查看 templates/drizzle-migrations-workflow.md 获取完整指南
neon-basic-queries.ts - 使用 Neon 的原始 SQL 查询模式
// 查看 templates/neon-basic-queries.ts 获取完整示例
package.json - 完整的依赖配置
// 查看 templates/package.json 获取完整配置
参考(references/)
- setup-guide.md - 完整的 7 步设置过程(安装 → 部署)
- error-catalog.md - 所有 15 个错误的解决方案和故障排除
- common-patterns.md - 5+ 生产模式(Cloudflare Workers、Next.js、Drizzle、事务、分支)
- advanced-topics.md - 分支工作流、连接池、性能、安全
依赖项
必需:
@neondatabase/serverless@^1.0.2- Neon 无服务器 Postgres 客户端(基于 HTTP/WebSocket)@vercel/postgres@^0.10.0- Vercel Postgres 客户端(Neon 直接的替代,Vercel 特定)
可选:
drizzle-orm@^0.44.7- TypeScript ORM(边缘兼容,推荐)drizzle-kit@^0.31.0- Drizzle 模式迁移和内省@prisma/client@^6.10.0- Prisma ORM(仅 Node.js,不边缘兼容)@prisma/adapter-neon@^6.10.0- Prisma 适配器用于 Neon 无服务器neonctl@^2.16.1- Neon CLI 用于数据库管理zod@^3.24.0- 模式验证用于输入清理
官方文档
- Neon 文档:https://neon.tech/docs
- Neon 无服务器包:https://github.com/neondatabase/serverless
- Vercel Postgres:https://vercel.com/docs/storage/vercel-postgres
- Vercel 存储(全部):https://vercel.com/docs/storage
- Neon 分支指南:https://neon.tech/docs/guides/branching
- Neonctl CLI:https://neon.tech/docs/reference/cli
- Drizzle + Neon:https://orm.drizzle.team/docs/quick-postgresql/neon
- Prisma + Neon:https://www.prisma.io/docs/orm/overview/databases/neon
- Context7 库 ID:
/github/neondatabase/serverless,/github/vercel/storage
包版本(已验证 2025-10-29)
{
"dependencies": {
"@neondatabase/serverless": "^1.0.2",
"@vercel/postgres": "^0.10.0",
"drizzle-orm": "^0.44.7"
},
"devDependencies": {
"drizzle-kit": "^0.31.0",
"neonctl": "^2.16.1"
}
}
最新 Prisma(如果需要):
{
"dependencies": {
"@prisma/client": "^6.10.0",
"@prisma/adapter-neon": "^6.10.0"
},
"devDependencies": {
"prisma": "^6.10.0"
}
}
生产示例
此技能基于 Neon 和 Vercel Postgres 的生产部署:
- Cloudflare Workers:API 每天 50K+ 请求,0 连接错误
- Vercel Next.js 应用:电子商务网站每月 100K+ 用户
- 构建时间:<5 分钟(初始设置),<30 秒(部署)
- 错误:0(所有 15 个已知问题已预防)
- 验证:✅ 连接池,✅ SQL 注入预防,✅ 事务处理,✅ 分支工作流
完整设置检查清单
使用此检查清单验证您的设置:
- [ ] 包已安装(
@neondatabase/serverless或@vercel/postgres) - [ ] Neon 数据库已创建(或 Vercel Postgres 已配置)
- [ ] 池化连接字符串已获取(以
-pooler.结尾) - [ ] 连接字符串包含
?sslmode=require - [ ] 环境变量已配置(
DATABASE_URL或POSTGRES_URL) - [ ] 数据库模式已创建(原始 SQL、Drizzle 或 Prisma)
- [ ] 查询使用模板标签语法(
sql`...`) - [ ] 事务使用正确的 try/catch 和释放连接
- [ ] 连接池已验证(使用池化连接字符串)
- [ ] ORM 选择适合运行时(Drizzle 用于边缘,Prisma 用于 Node.js)
- [ ] 本地测试使用开发数据库
- [ ] 已部署并在生产/预览环境中测试
- [ ] 在 Neon 仪表板中设置连接监控
问题?问题?
- 检查
references/error-catalog.md获取所有 15 个错误和故障排除 - 查看
references/setup-guide.md获取完整的 7 步设置过程 - 参见
references/common-patterns.md获取生产测试代码示例 - 检查官方文档:https://neon.tech/docs
- 确保您为无服务器环境使用池化连接字符串
- 验证连接字符串中包含
sslmode=require