原始 API
当您无法使用当前 Go 客户端功能时,可以使用原始 API。查询将被重定向到底层数据库,因此数据库支持的所有内容都应该可以工作。请注意,您需要使用您正在使用的数据库的特定语法。
注意:在定义返回值结构时,必须使用原生数据库类型。例如,MySQL 使用 int
表示 bool
。您也可以使用 Prisma 特定的原始数据类型,例如 RawInt
、RawString
,这样就可以在不考虑内部使用什么的情况下正常工作。如果您正在查询特定模型,也可以使用 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
进行诸如 INSERT
、UPDATE
或 DELETE
的操作。它将始终返回一个 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
进行诸如 INSERT
、UPDATE
或 DELETE
的操作。它将始终返回一个 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