Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add prisma orm example #2287

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions _examples/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
* [Sqlx](database/orm/sqlx/main.go)
* [Gorm](database/orm/gorm/main.go)
* [Reform](database/orm/reform/main.go)
* [prisma](database/orm/prisma/main.go) **NEW**
* [x/sqlx](database/sqlx/main.go) **NEW**
* GraphQL
* [GraphQL: schema-first](graphql/schema-first) **NEW**
Expand Down
1 change: 1 addition & 0 deletions _examples/database/orm/prisma/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
dev.db
12 changes: 12 additions & 0 deletions _examples/database/orm/prisma/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Prisma Go Iris Demo

## Instructions

```shell script
go run github.com/steebchen/prisma-client-go db push
go run .
```

## Next steps

Read the docs at [GoPrisma](https://goprisma.org/docs).
2 changes: 2 additions & 0 deletions _examples/database/orm/prisma/db/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# gitignore generated by Prisma Client Go. DO NOT EDIT.
*_gen.go
57 changes: 57 additions & 0 deletions _examples/database/orm/prisma/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
module demo

go 1.21

require (
github.com/iancoleman/strcase v0.0.0-20190422225806-e506e3ef7365
github.com/joho/godotenv v1.5.1
github.com/kataras/iris/v12 v12.2.8
github.com/shopspring/decimal v1.3.1
github.com/steebchen/prisma-client-go v0.26.0
github.com/takuoki/gocase v1.0.0
golang.org/x/text v0.14.0
)

require (
github.com/BurntSushi/toml v1.3.2 // indirect
github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53 // indirect
github.com/CloudyKit/jet/v6 v6.2.0 // indirect
github.com/Joker/jade v1.1.3 // indirect
github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06 // indirect
github.com/andybalholm/brotli v1.0.6 // indirect
github.com/aymerick/douceur v0.2.0 // indirect
github.com/fatih/structs v1.1.0 // indirect
github.com/flosch/pongo2/v4 v4.0.2 // indirect
github.com/golang/snappy v0.0.4 // indirect
github.com/gomarkdown/markdown v0.0.0-20230922112808-5421fefb8386 // indirect
github.com/google/uuid v1.4.0 // indirect
github.com/gorilla/css v1.0.0 // indirect
github.com/iris-contrib/schema v0.0.6 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/kataras/blocks v0.0.8 // indirect
github.com/kataras/golog v0.1.11 // indirect
github.com/kataras/pio v0.0.13 // indirect
github.com/kataras/sitemap v0.0.6 // indirect
github.com/kataras/tunnel v0.0.4 // indirect
github.com/klauspost/compress v1.17.2 // indirect
github.com/mailgun/raymond/v2 v2.0.48 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/microcosm-cc/bluemonday v1.0.26 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/schollz/closestmatch v2.1.0+incompatible // indirect
github.com/sirupsen/logrus v1.8.1 // indirect
github.com/tdewolff/minify/v2 v2.20.6 // indirect
github.com/tdewolff/parse/v2 v2.7.4 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect
github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect
github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
github.com/yosssi/ace v0.0.5 // indirect
golang.org/x/crypto v0.14.0 // indirect
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect
golang.org/x/net v0.17.0 // indirect
golang.org/x/sys v0.14.0 // indirect
golang.org/x/time v0.4.0 // indirect
google.golang.org/protobuf v1.31.0 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
215 changes: 215 additions & 0 deletions _examples/database/orm/prisma/go.sum

Large diffs are not rendered by default.

125 changes: 125 additions & 0 deletions _examples/database/orm/prisma/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
//go:generate go run github.com/steebchen/prisma-client-go db push

package main

import (
"context"
"demo/db"
"net/http"
"strconv"

"github.com/kataras/iris/v12"
"github.com/kataras/iris/v12/middleware/logger"
"github.com/kataras/iris/v12/middleware/recover"
)

func main() {
app := iris.Default()

client := db.NewClient()
if err := client.Prisma.Connect(); err != nil {
app.Logger().Fatalf("unable to connect to database: %v", err)
}

defer func() {
if err := client.Prisma.Disconnect(); err != nil {
app.Logger().Fatal(err)
}
}()

iris.RegisterOnInterrupt(func() {
client.Prisma.Disconnect()
})

app.Use(logger.New())
app.Use(recover.New())

app.Post("/tasks", func(ctx iris.Context) {
var task db.TaskModel
if err := ctx.ReadJSON(&task); err != nil {
app.Logger().Error("Bind: ", err)
ctx.StopWithText(iris.StatusBadRequest, "Bind: "+err.Error())
}
var text *string
if newText, ok := task.Text(); ok {
text = &newText
}
var completed *bool
if newCompleted, ok := task.Completed(); ok {
completed = &newCompleted
}
newTask, err := client.Task.CreateOne(
db.Task.Text.SetIfPresent(text),
db.Task.Completed.SetIfPresent(completed),
).Exec(context.Background())
if err != nil {
ctx.StopWithText(iris.StatusBadRequest, err.Error())
}
ctx.StopWithJSON(iris.StatusOK, newTask)
})

app.Get("/tasks", func(ctx iris.Context) {
tasks, err := client.Task.FindMany().OrderBy(
db.Task.ID.Order(db.ASC),
).Exec(context.Background())
if err != nil {
ctx.StopWithText(iris.StatusBadRequest, err.Error())
}
ctx.StopWithJSON(iris.StatusOK, tasks)
})

app.Post("/tasks/:id", func(ctx iris.Context) {
var task db.TaskModel
if err := ctx.ReadJSON(&task); err != nil {
app.Logger().Error("Bind: ", err)
ctx.StopWithText(http.StatusBadRequest, "Bind: "+err.Error())
}
var text *string
if newText, ok := task.Text(); ok {
text = &newText
}
var completed *bool
if newCompleted, ok := task.Completed(); ok {
completed = &newCompleted
}
newTask, err := client.Task.FindUnique(
db.Task.ID.Equals(task.ID),
).Update(
db.Task.Text.SetIfPresent(text),
db.Task.Completed.SetIfPresent(completed),
).Exec(context.Background())
if err != nil {
ctx.StopWithText(iris.StatusBadRequest, err.Error())
}
ctx.StopWithJSON(iris.StatusOK, newTask)
})

app.Delete("/tasks/:id", func(ctx iris.Context) {
id, err := strconv.Atoi(ctx.Params().Get("id"))
if err != nil {
ctx.StopWithText(iris.StatusBadRequest, err.Error())
}
task, err := client.Task.FindUnique(
db.Task.ID.Equals(id),
).Delete().Exec(context.Background())
if err != nil {
ctx.StopWithText(iris.StatusNotFound, err.Error())
}
ctx.StopWithJSON(iris.StatusOK, task)
})
app.Get("/tasks/:id", func(ctx iris.Context) {
id, err := strconv.Atoi(ctx.Params().Get("id"))
if err != nil {
ctx.StopWithText(iris.StatusBadRequest, err.Error())
}
task, err := client.Task.FindUnique(
db.Task.ID.Equals(id),
).Exec(context.Background())
if err != nil {
ctx.StopWithText(iris.StatusNotFound, err.Error())
}
ctx.StopWithJSON(http.StatusOK, task)
})

app.Listen(":8080")
}
15 changes: 15 additions & 0 deletions _examples/database/orm/prisma/schema.prisma
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
datasource db {
// could be postgresql or mysql
provider = "sqlite"
url = "file:dev.db"
}

generator db {
provider = "go run github.com/steebchen/prisma-client-go"
}

model Task {
id Int @id @default(autoincrement())
text String?
completed Boolean? @default(false)
}