Files
Hein 666eab7cec
Some checks failed
CI / Test (1.24) (push) Failing after -24m41s
CI / Test (1.25) (push) Failing after -24m25s
CI / Lint (push) Failing after -25m49s
CI / Build (push) Successful in -26m3s
Updated Readme files
2025-12-28 10:34:20 +02:00
..
2025-12-28 10:34:20 +02:00

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

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

# 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

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