Skip to main content

Bob Gen for Prisma

Generates an ORM based on a prisma schema file

How to Generate

  1. Initialise a new Go project. The generator must be run from inside a go module, so either the current directory or a parent directory should contain a go.mod file. If you don't have a Go project yet, initialise one using Go modules:

    mkdir demo && cd demo
    go mod init demo
  2. Get the Bob Prisma Generator. Install the Go module in your project by running:

    go get github.com/stephenafamo/bob/gen/bobgen-prisma
  3. Prepare your database schema in a schema.prisma file. For example, a simple schema with a postgres database and the Bob Prisma generator with two models would look like this:

    datasource db {
    // only postgresql is supported for now
    provider = "postgresql"
    url = env("DATABASE_URL")
    }

    generator db {
    provider = "go run github.com/stephenafamo/bob/gen/bobgen-prisma"
    output = "./prisma" // Optional. Default: ./db
    configFile = "./config/bobgen.yml" // Optional. Default ./bobgen.yaml
    }

    model Post {
    id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
    created_at DateTime @default(now()) @db.Timestamptz(6)
    updated_at DateTime @db.Timestamptz(6)
    title String
    published Boolean
    desc String?
    }
  4. Generate the models using prisma generate

How to Use

Detailed documentation on how to use the Bob ORM can be found here

A small taste

package main

import (
"context"
"encoding/json"
"fmt"

"random/prisma"

"github.com/aarondl/opt/omit"
"github.com/aarondl/opt/omitnull"
)

func main() {
if err := run(context.Background()); err != nil {
panic(err)
}
}

func run(ctx context.Context) error {
client, err := prisma.New()
if err != nil {
return err
}
defer client.Close()

// create a post
createdPost, err := prisma.PostsTable.Insert(ctx, client, &prisma.OptionalPost{
Title: omit.From("Hi from Prisma!"),
Published: omit.From(true),
Desc: omitnull.From("Prisma is a database toolkit and makes databases easy."),
UpdatedAt: omit.From(time.Now()),
})
if err != nil {
return err
}

result, _ := json.MarshalIndent(createdPost, "", " ")
fmt.Printf("created post: %s\n", result)

// find a single post
post, err := prisma.FindPost(ctx, client, createdPost.ID)
if err != nil {
return err
}

result, _ = json.MarshalIndent(post, "", " ")
fmt.Printf("post: %s\n", result)

// For optional/nullable values, the field will have a generic null wrapper
// with some helpful methods
if post.Desc.IsNull() {
return fmt.Errorf("post's description is null")
}

fmt.Printf("The posts's description is: %s\n", post.Desc.MustGet())

return nil
}

Detailed documentation on how to use the Bob ORM can be found here

Driver Configuration

The configuration for the prisma driver must all be prefixed by the driver name. You must use a configuration file or environment variables for configuring the database driver.

In the configuration file for prisma for example you would do:

prisma:
schema: "public"

When you use an environment variable it must also be prefixed by the driver name:

PRISMA_SCHEMA="public"

The values that exist for the drivers:

NameDescriptionDefault
pkgnamePackage name for generated code"prisma"
onlyOnly generate these
exceptSkip generation for these

Example of Only/Except:

psql:
# Removes Coupon model, the name field of the Product model, and
# secret of all Models from being generated. Foreign keys that reference tables
# or columns that are no longer generated may cause problems.
except:
User:
Product:
- name
"*":
- secret

How to use

Known Issues

@map attributes on columns are ignored

This is because @map information is currently not given to generators by the prisma command. See Issues #3998