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