
关于
Neon 无服务器 Postgres 的专家模式,涵盖分支、连接池和优化。
name: neon-postgres description: Neon无服务器Postgres的专家模式,包括分支、连接池和Prisma/Drizzle集成 risk: safe source: vibeship-spawner-skills (Apache 2.0) date_added: 2026-02-27
Neon Postgres
Neon无服务器Postgres的专家模式,包括分支、连接池和Prisma/Drizzle集成
模式
Prisma与Neon连接
为Neon配置Prisma连接池。
使用两个连接字符串:
- DATABASE_URL:用于Prisma Client的池化连接
- DIRECT_URL:用于Prisma Migrate的直接连接
池化连接使用PgBouncer支持最多10K个连接。 迁移(DDL操作)需要直接连接。
代码示例
# .env
# Pooled connection for application queries
DATABASE_URL="postgres://user:password@ep-xxx-pooler.us-east-2.aws.neon.tech/neondb?sslmode=require"
# Direct connection for migrations
DIRECT_URL="postgres://user:password@ep-xxx.us-east-2.aws.neon.tech/neondb?sslmode=require"
// prisma/schema.prisma
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
directUrl = env("DIRECT_URL")
}
model User {
id String @id @default(cuid())
email String @unique
name String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
// lib/prisma.ts
import { PrismaClient } from '@prisma/client';
const globalForPrisma = globalThis as unknown as {
prisma: PrismaClient | undefined;
};
export const prisma = globalForPrisma.prisma ?? new PrismaClient({
log: process.env.NODE_ENV === 'development'
? ['query', 'error', 'warn']
: ['error'],
});
if (process.env.NODE_ENV !== 'production') {
globalForPrisma.prisma = prisma;
}
// Run migrations
// Uses DIRECT_URL automatically
npx prisma migrate dev
npx prisma migrate deploy
反模式
- 模式:使用池化连接进行迁移 | 原因:DDL操作通过PgBouncer会失败 | 修复:在schema.prisma中设置directUrl
- 模式:不使用连接池 | 原因:无服务器函数会耗尽连接限制 | 修复:在DATABASE_URL中使用-pooler端点
参考资料
- https://neon.com/docs/guides/prisma
- https://www.prisma.io/docs/orm/overview/databases/neon
Drizzle与Neon无服务器驱动
在边缘/无服务器环境中使用Drizzle ORM配合Neon的无服务器HTTP驱动。
两种驱动选项:
- neon-http:通过HTTP的单次查询(单次查询最快)
- neon-serverless:用于事务和会话的WebSocket
代码示例
# Install dependencies
npm install drizzle-orm @neondatabase/serverless
npm install -D drizzle-kit
// lib/db/schema.ts
import { pgTable, serial, text, timestamp } from 'drizzle-orm/pg-core';
export const users = pgTable('users', {
id: serial('id').primaryKey(),
email: text('email').notNull().unique(),
name: text('name'),
createdAt: timestamp('created_at').defaultNow().notNull(),
updatedAt: timestamp('updated_at').defaultNow().notNull(),
});
// lib/db/index.ts (for serverless - HTTP driver)
import { neon } from '@neondatabase/serverless';
import { drizzle } from 'drizzle-orm/neon-http';
import * as schema from './schema';
const sql = neon(process.env.DATABASE_URL!);
export const db = drizzle(sql, { schema });
// Usage in API route
import { db } from '@/lib/db';
import { users } from '@/lib/db/schema';
export async function GET() {
const allUsers = await db.select().from(users);
return Response.json(allUsers);
}
// lib/db/index.ts (for WebSocket - transactions)
import { Pool } from '@neondatabase/serverless';
import { drizzle } from 'drizzle-orm/neon-serverless';
import * as schema from './schema';
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
export const db = drizzle(pool, { schema });
// With transactions
await db.transaction(async (tx) => {
await tx.insert(users).values({ email: 'test@example.com' });
await tx.update(users).set({ name: 'Updated' });
});
// drizzle.config.ts
import { defineConfig } from 'drizzle-kit';
export default defineConfig({
schema: './lib/db/schema.ts',
out: './drizzle',
dialect: 'postgresql',
dbCredentials: {
url: process.env.DATABASE_URL!,
},
});
// Run migrations
npx drizzle-kit generate
npx drizzle-kit migrate
反模式
- 模式:在无服务器环境中使用pg驱动 | 原因:TCP连接在所有边缘环境中不可用 | 修复:使用@neondatabase/serverless驱动
- 模式:HTTP驱动用于事务 | 原因:HTTP驱动不支持事务 | 修复:使用WebSocket驱动(Pool)处理事务
参考资料
- https://neon.com/docs/guides/drizzle
- https://orm.drizzle.team/docs/connect-neon
PgBouncer连接池
Neon通过PgBouncer提供内置连接池。
关键限制:
- 池化器最多支持10,000个并发连接
- 连接仍然消耗底层Postgres连接
- 7个连接保留给Neon超级用户
使用池化端点
兼容工具
Claude CodeCursor
标签
数据工程
