Files
gh-jezweb-claude-skills-ski…/templates/prisma-postgres.ts
2025-11-30 08:24:16 +08:00

152 lines
3.3 KiB
TypeScript

/**
* Prisma ORM with PostgreSQL
*
* Type-safe ORM for PostgreSQL via Hyperdrive using driver adapters.
*
* Install: npm install prisma @prisma/client pg @prisma/adapter-pg
*
* Setup:
* 1. npx prisma init
* 2. Define schema in prisma/schema.prisma
* 3. npx prisma generate --no-engine
* 4. npx prisma migrate dev (for migrations)
*
* CRITICAL: Must use driver adapters (@prisma/adapter-pg) for Hyperdrive
*/
import { PrismaPg } from "@prisma/adapter-pg";
import { PrismaClient } from "@prisma/client";
import { Pool } from "pg";
type Bindings = {
HYPERDRIVE: Hyperdrive;
};
/**
* Example Prisma schema (prisma/schema.prisma):
*
* generator client {
* provider = "prisma-client-js"
* previewFeatures = ["driverAdapters"]
* }
*
* datasource db {
* provider = "postgresql"
* url = env("DATABASE_URL")
* }
*
* model User {
* id Int @id @default(autoincrement())
* name String
* email String @unique
* createdAt DateTime @default(now())
* posts Post[]
* }
*
* model Post {
* id Int @id @default(autoincrement())
* title String
* content String?
* published Boolean @default(false)
* authorId Int
* author User @relation(fields: [authorId], references: [id])
* }
*/
export default {
async fetch(
request: Request,
env: Bindings,
ctx: ExecutionContext
): Promise<Response> {
// Create pg.Pool for driver adapter
const pool = new Pool({
connectionString: env.HYPERDRIVE.connectionString,
max: 5
});
// Create Prisma driver adapter
const adapter = new PrismaPg(pool);
// Create Prisma client with adapter
const prisma = new PrismaClient({ adapter });
try {
// Example: Create user
const newUser = await prisma.user.create({
data: {
name: "John Doe",
email: `john.${Date.now()}@example.com`
}
});
// Example: Find all users
const allUsers = await prisma.user.findMany({
include: {
posts: true // Include related posts
}
});
// Example: Find user by email
const user = await prisma.user.findUnique({
where: {
email: "john@example.com"
}
});
// Example: Update user
await prisma.user.update({
where: { id: newUser.id },
data: { name: "Jane Doe" }
});
// Example: Create post with relation
await prisma.post.create({
data: {
title: "My First Post",
content: "Hello World!",
published: true,
authorId: newUser.id
}
});
// Example: Complex query with filters
const recentUsers = await prisma.user.findMany({
where: {
createdAt: {
gte: new Date('2024-01-01')
}
},
orderBy: {
createdAt: 'desc'
},
take: 10
});
return Response.json({
success: true,
data: {
newUser,
allUsers,
user,
recentUsers
}
});
} catch (error: any) {
console.error("Database error:", error);
return Response.json({
success: false,
error: error.message
}, {
status: 500
});
} finally {
// Clean up connections
ctx.waitUntil(pool.end());
}
}
};