136 lines
3.2 KiB
Markdown
136 lines
3.2 KiB
Markdown
# Prisma Writer
|
|
|
|
Generates Prisma schema files from database schema information.
|
|
|
|
## Overview
|
|
|
|
The Prisma Writer converts RelSpec's internal database model representation into Prisma schema language (`.prisma` files), complete with models, fields, relationships, and attributes.
|
|
|
|
## Features
|
|
|
|
- Generates Prisma schema syntax
|
|
- Creates model definitions with proper field types
|
|
- Adds Prisma attributes (@id, @unique, @default, etc.)
|
|
- Generates relationship fields
|
|
- Includes datasource and generator configurations
|
|
- Maps table/column names with @map and @@map
|
|
|
|
## Usage
|
|
|
|
### Basic Example
|
|
|
|
```go
|
|
package main
|
|
|
|
import (
|
|
"git.warky.dev/wdevs/relspecgo/pkg/models"
|
|
"git.warky.dev/wdevs/relspecgo/pkg/writers"
|
|
"git.warky.dev/wdevs/relspecgo/pkg/writers/prisma"
|
|
)
|
|
|
|
func main() {
|
|
options := &writers.WriterOptions{
|
|
OutputPath: "schema.prisma",
|
|
Metadata: map[string]interface{}{
|
|
"datasource_provider": "postgresql",
|
|
},
|
|
}
|
|
|
|
writer := prisma.NewWriter(options)
|
|
err := writer.WriteDatabase(db)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
```
|
|
|
|
### CLI Examples
|
|
|
|
```bash
|
|
# Generate Prisma schema from PostgreSQL database
|
|
relspec --input pgsql \
|
|
--conn "postgres://localhost/mydb" \
|
|
--output prisma \
|
|
--out-file schema.prisma
|
|
|
|
# Convert GORM models to Prisma
|
|
relspec --input gorm --in-file models.go --output prisma --out-file schema.prisma
|
|
|
|
# Convert JSON to Prisma schema
|
|
relspec --input json --in-file database.json --output prisma --out-file prisma/schema.prisma
|
|
```
|
|
|
|
## Generated Code Example
|
|
|
|
```prisma
|
|
datasource db {
|
|
provider = "postgresql"
|
|
url = env("DATABASE_URL")
|
|
}
|
|
|
|
generator client {
|
|
provider = "prisma-client-js"
|
|
}
|
|
|
|
model User {
|
|
id Int @id @default(autoincrement())
|
|
username String @unique @db.VarChar(50)
|
|
email String @db.VarChar(100)
|
|
bio String? @db.Text
|
|
createdAt DateTime @default(now()) @map("created_at")
|
|
|
|
posts Post[]
|
|
|
|
@@map("users")
|
|
}
|
|
|
|
model Post {
|
|
id Int @id @default(autoincrement())
|
|
userId Int @map("user_id")
|
|
title String @db.VarChar(200)
|
|
content String? @db.Text
|
|
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
|
|
@@map("posts")
|
|
}
|
|
```
|
|
|
|
## Supported Prisma Attributes
|
|
|
|
### Field Attributes
|
|
- `@id` - Primary key
|
|
- `@unique` - Unique constraint
|
|
- `@default()` - Default value
|
|
- `@map()` - Column name mapping
|
|
- `@db.*` - Database-specific types
|
|
- `@relation()` - Relationship definition
|
|
|
|
### Model Attributes
|
|
- `@@map()` - Table name mapping
|
|
- `@@unique()` - Composite unique constraints
|
|
- `@@index()` - Index definitions
|
|
- `@@id()` - Composite primary keys
|
|
|
|
## Type Mapping
|
|
|
|
| SQL Type | Prisma Type | Database Type |
|
|
|----------|-------------|---------------|
|
|
| bigint | Int | @db.BigInt |
|
|
| integer | Int | - |
|
|
| varchar(n) | String | @db.VarChar(n) |
|
|
| text | String | @db.Text |
|
|
| boolean | Boolean | - |
|
|
| timestamp | DateTime | @db.Timestamp |
|
|
| uuid | String | @db.Uuid |
|
|
| json | Json | - |
|
|
|
|
## Notes
|
|
|
|
- Model names are PascalCase (e.g., `User`, `Post`)
|
|
- Field names are camelCase with `@map` for snake_case columns
|
|
- Table names use `@@map` when different from model name
|
|
- Nullable fields are marked with `?`
|
|
- Relationship fields are automatically generated
|
|
- Datasource provider defaults to `postgresql`
|