重要前提
安装AI Skills的关键前提是:必须科学上网,且开启TUN模式,这一点至关重要,直接决定安装能否顺利完成,在此郑重提醒三遍:科学上网,科学上网,科学上网。查看完整安装教程 →
neon-vercel-postgres by secondsky/claude-skills
npx skills add https://github.com/secondsky/claude-skills --skill neon-vercel-postgres状态 : 生产就绪 最后更新 : 2025-11-21 依赖项 : 无 最新版本 : @neondatabase/serverless@1.0.2, @vercel/postgres@0.10.0, drizzle-orm@0.44.7, neonctl@2.16.1
选项 A: Neon Direct (多云、Cloudflare Workers、任何无服务器环境)
bun add @neondatabase/serverless
选项 B: Vercel Postgres (仅限 Vercel,在 Vercel 上零配置)
bun add @vercel/postgres
为何重要:
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
对于 Neon Direct:
# 在 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 参数Neon Direct:
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.)
✅ 使用模板标签语法进行查询 (sqlSELECT * 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 - 使池化失效
❌ 切勿超出连接限制 - 监控使用情况并在需要时升级计划
错误 : Error: connection pool exhausted 或 too many connections for role 解决方案 : 使用池化连接字符串 (以 -pooler.region.aws.neon.tech 结尾),而非非池化
错误 : Error: TCP connections are not supported in this environment 解决方案 : 使用 @neondatabase/serverless (基于 HTTP),而非 pg 或 postgres.js (基于 TCP)
错误 : 成功的 SQL 注入攻击 解决方案 : 始终使用模板标签 (sqlSELECT * FROM users WHERE id = ${id}``),切勿拼接字符串
错误 : Error: connection requires SSL 解决方案 : 始终在连接字符串后附加 ?sslmode=require
错误 : 内存使用量逐渐增加 解决方案 : 在手动事务后的 finally 块中始终调用 client.release()
加载references/error-catalog.md以获取全部 15 个错误及其详细解决方案和故障排除指南。
何时使用 : 在 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
何时使用 : 使用 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
何时使用 : 需要完整的 TypeScript 类型安全性和边缘兼容性 加载 : references/common-patterns.md → 模式 3
何时使用 : 多个操作必须全部成功或全部失败 (例如,资金转账) 加载 : references/common-patterns.md → 模式 4
何时使用 : 需要为每个拉取请求/预览部署提供隔离的数据库 加载 : references/common-patterns.md → 模式 5
当以下情况时加载references/setup-guide.md:
当以下情况时加载references/error-catalog.md:
当以下情况时加载references/common-patterns.md:
当以下情况时加载references/advanced-topics.md:
{
"dependencies": {
"@neondatabase/serverless": "^1.0.2"
}
}
{
"dependencies": {
"@vercel/postgres": "^0.10.0"
}
}
{
"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"
}
}
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 处理迁移和模式生成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 获取完整配置
必需 :
@neondatabase/serverless@^1.0.2 - Neon 无服务器 Postgres 客户端 (基于 HTTP/WebSocket)@vercel/postgres@^0.10.0 - Vercel Postgres 客户端 (Neon direct 的替代品,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 - 用于 Neon 无服务器的 Prisma 适配器neonctl@^2.16.1 - 用于数据库管理的 Neon CLIzod@^3.24.0 - 用于输入清理的模式验证/github/neondatabase/serverless, /github/vercel/storage{
"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 的生产部署:
使用此清单验证您的设置:
@neondatabase/serverless 或 @vercel/postgres)-pooler. 结尾)?sslmode=requireDATABASE_URL 或 POSTGRES_URL)sql...``)有问题?遇到问题?
references/error-catalog.md 获取全部 15 个错误和故障排除references/setup-guide.md 获取完整的 7 步设置流程references/common-patterns.md 获取经过生产测试的代码示例sslmode=require每周安装次数
65
仓库
GitHub Stars
90
首次出现
Jan 25, 2026
安全审计
已安装于
claude-code57
gemini-cli52
cursor52
codex51
opencode50
github-copilot48
Status : Production Ready Last Updated : 2025-11-21 Dependencies : None Latest Versions : @neondatabase/serverless@1.0.2, @vercel/postgres@0.10.0, drizzle-orm@0.44.7, neonctl@2.16.1
Option A: Neon Direct (multi-cloud, Cloudflare Workers, any serverless)
bun add @neondatabase/serverless
Option B: Vercel Postgres (Vercel-only, zero-config on Vercel)
bun add @vercel/postgres
Why this matters:
For Neon Direct:
# Sign up at https://neon.tech
# Create a project → Get connection string
# Format: postgresql://user:password@ep-xyz-pooler.region.aws.neon.tech/dbname?sslmode=require
For Vercel Postgres:
# In your Vercel project
vercel postgres create
vercel env pull .env.local # Automatically creates POSTGRES_URL and other vars
CRITICAL:
-pooler.region.aws.neon.tech)?sslmode=require parameterNeon Direct:
import { neon } from '@neondatabase/serverless';
const sql = neon(process.env.DATABASE_URL!);
// Simple query
const users = await sql`SELECT * FROM users WHERE id = ${userId}`;
// Transactions
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';
// Simple query
const { rows } = await sql`SELECT * FROM users WHERE id = ${userId}`;
// Transactions
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();
}
CRITICAL:
sql...``) for automatic SQL injection protectionsql('SELECT * FROM users WHERE id = ' + id) ❌✅ Use pooled connection strings for serverless environments (-pooler. in hostname)
✅ Use template tag syntax for queries (sqlSELECT * FROM users``) to prevent SQL injection
✅ Includesslmode=require in connection strings
✅ Release connections after transactions (Vercel Postgres manual transactions)
✅ Use Drizzle ORM for edge-compatible TypeScript ORM (not Prisma in Cloudflare Workers)
✅ Set connection string as environment variable (never hardcode)
✅ Use Neon branching for preview environments and testing
✅ Monitor connection pool usage in Neon dashboard
✅ Handle errors with try/catch blocks and rollback transactions on failure
✅ UseRETURNING clause for INSERT/UPDATE to get created/updated data in one query
❌ Never use non-pooled connections in serverless functions (will exhaust connection pool)
❌ Never concatenate SQL strings ('SELECT * FROM users WHERE id = ' + id) - SQL injection risk
❌ Never omitsslmode=require - connections will fail or be insecure
❌ Never forget toclient.release() in manual Vercel Postgres transactions - connection leak
❌ Never use Prisma in Cloudflare Workers - requires Node.js runtime (use Drizzle instead)
❌ Never hardcode connection strings - use environment variables
❌ Never run migrations from edge functions - use Node.js environment or Neon console
❌ Never commit.env files - add to .gitignore
❌ Never usePOSTGRES_URL_NON_POOLING in serverless functions - defeats pooling
❌ Never exceed connection limits - monitor usage and upgrade plan if needed
Error : Error: connection pool exhausted or too many connections for role Solution : Use pooled connection string (ends with -pooler.region.aws.neon.tech), not non-pooled
Error : Error: TCP connections are not supported in this environment Solution : Use @neondatabase/serverless (HTTP-based), not pg or postgres.js (TCP-based)
Error : Successful SQL injection attack Solution : Always use template tags (sqlSELECT * FROM users WHERE id = ${id}``), never concatenate strings
Error : Error: connection requires SSL Solution : Always append ?sslmode=require to connection string
Error : Gradually increasing memory usage Solution : Always call client.release() in finally block after manual transactions
Loadreferences/error-catalog.md for all 15 errors with detailed solutions and troubleshooting guide.
When : Deploying serverless API with Postgres on Cloudflare Workers Quick Pattern :
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);
}
};
Load : references/common-patterns.md → Pattern 1
When : Building Next.js app with Vercel Postgres Quick Pattern :
'use server';
import { sql } from '@vercel/postgres';
export async function getUsers() {
const { rows } = await sql`SELECT * FROM users`;
return rows;
}
Load : references/common-patterns.md → Pattern 2
When : Need full TypeScript type safety and edge compatibility Load : references/common-patterns.md → Pattern 3
When : Multiple operations must all succeed or all fail (e.g., money transfers) Load : references/common-patterns.md → Pattern 4
When : Need isolated database for each pull request/preview deployment Load : references/common-patterns.md → Pattern 5
Loadreferences/setup-guide.md when:
Loadreferences/error-catalog.md when:
Loadreferences/common-patterns.md when:
Loadreferences/advanced-topics.md when:
{
"dependencies": {
"@neondatabase/serverless": "^1.0.2"
}
}
{
"dependencies": {
"@vercel/postgres": "^0.10.0"
}
}
{
"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"
}
}
import { defineConfig } from 'drizzle-kit';
export default defineConfig({
schema: './db/schema.ts',
out: './db/migrations',
dialect: 'postgresql',
dbCredentials: {
url: process.env.DATABASE_URL!
}
});
Why these settings:
@neondatabase/serverless is edge-compatible (HTTP/WebSocket-based)@vercel/postgres provides zero-config on Verceldrizzle-orm works in all runtimes (Cloudflare Workers, Vercel Edge, Node.js)drizzle-kit handles migrations and schema generationdrizzle-schema.ts - Complete Drizzle schema with users, posts, relations
// See templates/drizzle-schema.ts for full example
drizzle-queries.ts - Common query patterns (SELECT, INSERT, UPDATE, DELETE, joins)
// See templates/drizzle-queries.ts for full example
drizzle-migrations-workflow.md - Complete migration workflow guide
// See templates/drizzle-migrations-workflow.md for full guide
neon-basic-queries.ts - Raw SQL query patterns with Neon
// See templates/neon-basic-queries.ts for full example
package.json - Complete dependency configuration
// See templates/package.json for full config
Required :
@neondatabase/serverless@^1.0.2 - Neon serverless Postgres client (HTTP/WebSocket-based)@vercel/postgres@^0.10.0 - Vercel Postgres client (alternative to Neon direct, Vercel-specific)Optional :
drizzle-orm@^0.44.7 - TypeScript ORM (edge-compatible, recommended)drizzle-kit@^0.31.0 - Drizzle schema migrations and introspection@prisma/client@^6.10.0 - Prisma ORM (Node.js only, not edge-compatible)@prisma/adapter-neon@^6.10.0 - Prisma adapter for Neon serverlessneonctl@^2.16.1 - Neon CLI for database managementzod@^3.24.0 - Schema validation for input sanitization/github/neondatabase/serverless, /github/vercel/storage{
"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"
}
}
Latest Prisma (if needed) :
{
"dependencies": {
"@prisma/client": "^6.10.0",
"@prisma/adapter-neon": "^6.10.0"
},
"devDependencies": {
"prisma": "^6.10.0"
}
}
This skill is based on production deployments of Neon and Vercel Postgres:
Use this checklist to verify your setup:
@neondatabase/serverless or @vercel/postgres)-pooler.)?sslmode=requireDATABASE_URL or POSTGRES_URL)sql...``)Questions? Issues?
references/error-catalog.md for all 15 errors and troubleshootingreferences/setup-guide.md for complete 7-step setup processreferences/common-patterns.md for production-tested code examplessslmode=require is in connection stringWeekly Installs
65
Repository
GitHub Stars
90
First Seen
Jan 25, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
claude-code57
gemini-cli52
cursor52
codex51
opencode50
github-copilot48