186 lines
3.5 KiB
Markdown
186 lines
3.5 KiB
Markdown
# prisma db pull
|
|
|
|
Introspects an existing database and updates your Prisma schema to reflect its structure.
|
|
|
|
## Command
|
|
|
|
```bash
|
|
prisma db pull [options]
|
|
```
|
|
|
|
## What It Does
|
|
|
|
- Connects to your database
|
|
- Reads the database schema (tables, columns, relations, indexes)
|
|
- Updates `schema.prisma` with corresponding Prisma models
|
|
- For MongoDB, samples data to infer schema
|
|
|
|
## Options
|
|
|
|
| Option | Description |
|
|
|--------|-------------|
|
|
| `--force` | Ignore current Prisma schema file |
|
|
| `--print` | Print the introspected Prisma schema to stdout |
|
|
| `--schema` | Custom path to your Prisma schema |
|
|
| `--config` | Custom path to your Prisma config file |
|
|
| `--url` | Override the datasource URL from the Prisma config file |
|
|
| `--composite-type-depth` | Specify the depth for introspecting composite types (default: -1 for infinite, 0 = off) |
|
|
| `--schemas` | Specify the database schemas to introspect |
|
|
| `--local-d1` | Generate a Prisma schema from a local Cloudflare D1 database |
|
|
|
|
## Examples
|
|
|
|
### Basic introspection
|
|
|
|
```bash
|
|
prisma db pull
|
|
```
|
|
|
|
### Preview without writing
|
|
|
|
```bash
|
|
prisma db pull --print
|
|
```
|
|
|
|
Outputs schema to terminal for review.
|
|
|
|
### Force overwrite
|
|
|
|
```bash
|
|
prisma db pull --force
|
|
```
|
|
|
|
Replaces schema file, losing any manual customizations.
|
|
|
|
## Prerequisites
|
|
|
|
Configure database connection in `prisma.config.ts`:
|
|
|
|
```typescript
|
|
import 'dotenv/config'
|
|
import { defineConfig, env } from 'prisma/config'
|
|
|
|
export default defineConfig({
|
|
schema: 'prisma/schema.prisma',
|
|
datasource: {
|
|
url: env('DATABASE_URL'),
|
|
},
|
|
})
|
|
```
|
|
|
|
## Workflow
|
|
|
|
### Starting from existing database
|
|
|
|
1. Initialize Prisma:
|
|
```bash
|
|
prisma init
|
|
```
|
|
|
|
2. Configure database URL
|
|
|
|
3. Pull schema:
|
|
```bash
|
|
prisma db pull
|
|
```
|
|
|
|
4. Review and customize generated schema
|
|
|
|
5. Generate client:
|
|
```bash
|
|
prisma generate
|
|
```
|
|
|
|
### Syncing changes from database
|
|
|
|
When database changes are made outside Prisma:
|
|
|
|
```bash
|
|
prisma db pull
|
|
prisma generate
|
|
```
|
|
|
|
## Generated Schema Example
|
|
|
|
Database tables become Prisma models:
|
|
|
|
```sql
|
|
-- Database tables
|
|
CREATE TABLE users (
|
|
id SERIAL PRIMARY KEY,
|
|
email VARCHAR(255) UNIQUE NOT NULL,
|
|
name VARCHAR(100)
|
|
);
|
|
|
|
CREATE TABLE posts (
|
|
id SERIAL PRIMARY KEY,
|
|
title VARCHAR(255) NOT NULL,
|
|
author_id INTEGER REFERENCES users(id)
|
|
);
|
|
```
|
|
|
|
Becomes:
|
|
|
|
```prisma
|
|
model users {
|
|
id Int @id @default(autoincrement())
|
|
email String @unique @db.VarChar(255)
|
|
name String? @db.VarChar(100)
|
|
posts posts[]
|
|
}
|
|
|
|
model posts {
|
|
id Int @id @default(autoincrement())
|
|
title String @db.VarChar(255)
|
|
author_id Int?
|
|
users users? @relation(fields: [author_id], references: [id])
|
|
}
|
|
```
|
|
|
|
## Post-Introspection Cleanup
|
|
|
|
After `db pull`, consider:
|
|
|
|
1. **Rename models** to PascalCase:
|
|
```prisma
|
|
model User { // Was: users
|
|
@@map("users")
|
|
}
|
|
```
|
|
|
|
2. **Rename fields** to camelCase:
|
|
```prisma
|
|
authorId Int? @map("author_id")
|
|
```
|
|
|
|
3. **Add relation names** for clarity:
|
|
```prisma
|
|
author User? @relation("PostAuthor", fields: [authorId], references: [id])
|
|
```
|
|
|
|
4. **Add documentation**:
|
|
```prisma
|
|
/// User account information
|
|
model User {
|
|
/// Primary email for authentication
|
|
email String @unique
|
|
}
|
|
```
|
|
|
|
## MongoDB Introspection
|
|
|
|
For MongoDB, `db pull` samples documents to infer schema:
|
|
|
|
```bash
|
|
prisma db pull
|
|
```
|
|
|
|
May require manual refinement since MongoDB is schemaless.
|
|
|
|
## Warning
|
|
|
|
`db pull` overwrites your schema file. Always:
|
|
- Commit current schema before pulling
|
|
- Use `--print` to preview first
|
|
- Backup customizations you want to keep
|