文档
演练
原始

原始 API

当您无法使用当前 Go 客户端功能时,可以使用原始 API。查询将被重定向到底层数据库,因此数据库支持的所有内容都应该可以工作。请注意,您需要使用您正在使用的数据库的特定语法。

注意:在定义返回值结构时,必须使用原生数据库类型。例如,MySQL 使用 int 表示 bool。您也可以使用 Prisma 特定的原始数据类型,例如 RawIntRawString,这样就可以在不考虑内部使用什么的情况下正常工作。如果您正在查询特定模型,也可以使用 Raw<Model>Model,例如 RawPostModel 而不是 PostModel

以下示例使用以下 prisma 模式

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

查询

使用 QueryRaw 查询数据并自动将其解组为结构体切片。

选择全部

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

带参数选择

// 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)

自定义查询

// 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)

操作

使用 ExecuteRaw 进行诸如 INSERTUPDATEDELETE 的操作。它将始终返回一个 Result{Count: int},其中包含受影响的行数。

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

PostgreSQL

查询

使用 QueryRaw 查询数据并自动将其解组为结构体切片。

选择模型的所有内容

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

使用参数选择

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

自定义查询

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)

使用 Prisma 原生类型

为了确保与数据库和 Go 类型兼容,您可以使用原生类型。

// 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)

操作

使用 ExecuteRaw 进行诸如 INSERTUPDATEDELETE 的操作。它将始终返回一个 Result{Count: int},其中包含受影响的行数。

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