Skip to Content

Raw API

You can use the raw API when there’s something you can’t do with the current go client features. The query will be redirected to the underlying database, so everything supported by the database should work. Please note that you need to use the syntax specific to the database you’re using.

NOTE: When defining your return type structure, you have to use the native database type. For example, MySQL uses int for bool. You can also use Prisma-specific raw data types, such as RawInt, RawString, so that it works without having to think about what is used internally. If you are querying for a specific model, you can also use Raw<Model>Model, e.g. RawPostModel instead of PostModel.

The examples use the following prisma schema:

model Post { id String @id @default(cuid()) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt published Boolean title String content String? views Int @default(0) comments Comment[] } model Comment { id String @id @default(cuid()) createdAt DateTime @default(now()) content String post Post @relation(fields: [postID], references: [id]) postID String }

MySQL & SQLite

Query

Use QueryRaw to query for data and automatically unmarshal it into a slice of structs.

Select all

var posts []db.RawPostModel err := client.Prisma.QueryRaw("SELECT * FROM `Post`").Exec(ctx, &posts)

Select with parameters

// note the usage of RawPostModel instead of PostModel var posts []db.RawPostModel err := client.Prisma.QueryRaw("SELECT * FROM `Post` WHERE id = ? AND title = ?", "123abc", "my post").Exec(ctx, &posts)

Custom Query

// note the usage of db.RawString, db.RawInt, etc. var res []struct{ PostID db.RawString `json:"post_id"` Comments db.RawInt `json:"comments"` } err := client.Prisma.QueryRaw("SELECT post_id, count(*) as comments FROM `Comment` GROUP BY post_id").Exec(ctx, &res)

Operations

Use ExecuteRaw for operations such as INSERT, UPDATE or DELETE. It will always return a Result{Count: int}, which contains the affected rows.

result, err := client.Prisma.ExecuteRaw("UPDATE `Post` SET title = ? WHERE id = ?", "my post", "123").Exec(ctx) println(result.Count) // 1

Postgres

Query

Use QueryRaw to query for data and automatically unmarshal it into a slice of structs.s

Select all for a model

var posts []db.RawPostModel err := client.Prisma.QueryRaw(`SELECT * FROM "Post"`).Exec(ctx, &posts)

Select with parameters

var posts []db.RawPostModel err := client.Prisma.QueryRaw(`SELECT * FROM "Post" WHERE id = $1 AND title = $2`, "id2", "title2").Exec(ctx, &posts)

Custom Query

var res []struct{ ID db.RawString `json:"id"` Published db.RawBoolean `json:"published"` } err := client.Prisma.QueryRaw(`SELECT id, published FROM "Post"`).Exec(ctx, &res)

Using Prisma raw types

To ensure compatibility with database and go types, you can use raw types.

// note the usage of db.RawString, db.RawInt, etc. var res []struct{ ID db.RawString `json:"post_id"` Published db.RawBoolean `json:"published"` } err := client.Prisma.QueryRaw(`SELECT post_id, count(*) as comments FROM "Comment" GROUP BY post_id`).Exec(ctx, &res)

Operations

Use ExecuteRaw for operations such as INSERT, UPDATE or DELETE. It will always return a Result{Count: int}, which contains the affected rows.

result, err := client.Prisma.ExecuteRaw(`UPDATE "Post" SET title = $1 WHERE id = $2`, "my post", "123").Exec(ctx) println(result.Count) // 1
Last updated on