83 lines
2.6 KiB
Markdown
83 lines
2.6 KiB
Markdown
# Prisma 7 Client Instantiation
|
|
|
|
Prisma 7 changed how PrismaClient connects to databases. The CLI (`prisma db push`, `prisma migrate`) reads the URL from `prisma.config.ts`. But at **runtime**, you must provide a driver adapter to PrismaClient explicitly.
|
|
|
|
## Required packages
|
|
|
|
```bash
|
|
npm install @prisma/client @prisma/adapter-pg pg
|
|
```
|
|
|
|
- `@prisma/adapter-pg` — the Prisma adapter for the `pg` PostgreSQL driver
|
|
- `pg` — the underlying Node.js PostgreSQL driver
|
|
|
|
## Basic instantiation
|
|
|
|
```typescript
|
|
import 'dotenv/config'
|
|
import pg from 'pg'
|
|
import { PrismaPg } from '@prisma/adapter-pg'
|
|
import { PrismaClient } from './generated/prisma/client.js'
|
|
|
|
const pool = new pg.Pool({ connectionString: process.env.DATABASE_URL })
|
|
const adapter = new PrismaPg(pool)
|
|
const prisma = new PrismaClient({ adapter })
|
|
```
|
|
|
|
## Key rules
|
|
|
|
1. **Import path**: Always `./generated/prisma/client.js` — not `./generated/prisma` and not `@prisma/client`.
|
|
|
|
2. **Adapter is mandatory**: `new PrismaClient()` with no arguments throws. `new PrismaClient({ datasourceUrl: '...' })` also throws — `datasourceUrl` does not exist in Prisma 7.
|
|
|
|
3. **ESM required**: The generated client uses ESM. Ensure `package.json` has `"type": "module"`.
|
|
|
|
4. **Pool lifecycle**: Call `await pool.end()` when shutting down (after `prisma.$disconnect()`).
|
|
|
|
## Usage in application code
|
|
|
|
```typescript
|
|
import 'dotenv/config'
|
|
import pg from 'pg'
|
|
import { PrismaPg } from '@prisma/adapter-pg'
|
|
import { PrismaClient } from './generated/prisma/client.js'
|
|
|
|
const pool = new pg.Pool({ connectionString: process.env.DATABASE_URL })
|
|
const adapter = new PrismaPg(pool)
|
|
const prisma = new PrismaClient({ adapter })
|
|
|
|
// Create
|
|
const user = await prisma.user.create({
|
|
data: { email: 'alice@example.com', name: 'Alice' },
|
|
})
|
|
|
|
// Read with relations
|
|
const posts = await prisma.post.findMany({
|
|
where: { published: true },
|
|
include: { author: true },
|
|
})
|
|
|
|
// Update
|
|
await prisma.post.update({
|
|
where: { id: 1 },
|
|
data: { published: true },
|
|
})
|
|
|
|
// Delete
|
|
await prisma.post.delete({ where: { id: 1 } })
|
|
|
|
// Cleanup
|
|
await prisma.$disconnect()
|
|
await pool.end()
|
|
```
|
|
|
|
## Common mistakes
|
|
|
|
| Mistake | Error | Fix |
|
|
|---|---|---|
|
|
| `import { PrismaClient } from './generated/prisma'` | `Cannot find module` | Use `./generated/prisma/client.js` |
|
|
| `new PrismaClient()` | `PrismaClient needs non-empty options` | Pass `{ adapter }` |
|
|
| `new PrismaClient({ datasourceUrl: url })` | `Unknown property datasourceUrl` | Use adapter pattern instead |
|
|
| Missing `"type": "module"` in package.json | ESM import errors | Add `"type": "module"` |
|
|
| `import { PrismaClient } from '@prisma/client'` | Wrong export | Use `./generated/prisma/client.js` |
|