原始查询
有时 Prisma Client Rust 公开的函数无法表达您需要的查询。在这种情况下,您可以使用客户端的原始查询功能向您的数据库发送任意查询。
关系型数据库
_query_raw
和 _execute_raw
可用于向您的数据库发送原始 SQL,并带有完全消毒的参数。
The prisma_client_rust::raw
宏将 SQL 查询作为其第一个参数,后跟类型为 prisma_client_rust::PrismaValue
的查询变量。要指定在查询中插入变量的位置,请使用 {}
。Prisma Client Rust 将负责为您插入正确的数据库特定变量标识符。
尽管 raw
看起来类似于 format
和 print
,但它不会在编译时验证您提供的变量数量是否与查询中的 {}
数量匹配。这只会发生在运行时。
如果要提供的参数是动态构建的,因此无法在 raw
宏中指定,您可以导入 Raw
结构体,并通过使用 SQL 查询和 Vec
调用 new
手动创建一个 PrismaValue
。
示例使用以下 Prisma 模式,并假设 SQLite 数据库
model Post {
id String @id @default(cuid())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
published Boolean
title String
content String?
views Int @default(0)
}
_query_raw
使用 _query_raw
读取数据。返回类型是您指定的泛型的 Vec
,它必须实现 serde::Deserialize
(在新标签页中打开)。泛型表示查询返回的行形状。
参见此枚举以了解数据库类型如何映射到 Rust 类型。
use prisma_client_rust::{raw, PrismaValue};
use serde::Deserialize;
#[derive(Deserialize)]
struct QueryReturnType {
id: String,
title: String
}
let data: Vec<QueryReturnType> = client
._query_raw(raw!(
"SELECT id, title FROM Post WHERE id != {}",
PrismaValue::String("NotThisID".to_string())
))
.exec()
.await?;
_execute_raw
使用 _execute_raw
写入数据。它返回修改的行数。
use prisma_client_rust::{raw, PrismaValue};
let count = client
._execute_raw(raw!(
"INSERT INTO Post (published, title) VALUES ({}, {})",
PrismaValue::Boolean(false),
PrismaValue::String("A Title".to_string())
))
.exec()
.await?;
assert_eq!(count, 1);
MongoDB
自 v0.6.7 起可用
使用 MongDB 时,客户端公开了多个用于执行使用 serde_json::Value
(在新标签页中打开) 作为参数的原始查询的函数。
所有这些都返回一个必须实现 serde::Deserialize (在新标签页中打开) 的泛型类型。
_run_command_raw
对数据库运行任意命令,接受除以下之外的所有 MongoDB 数据库命令 (在新标签页中打开)
find
(请改用find_raw
)aggregate
(请使用aggregate_raw
代替)
使用此查询时有一些规则,这些规则在 Prisma 文档 (在新标签页中打开) 中有说明(其等效项为 $runCommandRaw
)。
use serde_json::{json, Value};
let data = client
._run_command_raw::<Vec<Value>>(json!({
"insert": "Post",
"documents": [{
"_id": "1",
"title": "Post One"
}]
}))
.exec()
.await?;
assert_eq!(data.len(), 1);
find_raw
返回给定模型的实际数据库记录。
方法
filter
- 提供查询谓词过滤器options
- 传递给find
命令 (在新标签页中打开) 的其他选项
use serde_json::{json, Value};
let res = client
.post()
.find_raw::<Vec<Value>>()
.filter(json!({ "title": { "$eq": "Some Title" } }))
.options(json!({ "projection": { "_id": false } }))
.exec()
.await?;
aggregate_raw
返回给定模型的聚合数据库记录。
方法
pipeline
- 一个 聚合管道 (在新标签页中打开)options
- 传递给aggregate
命令 (在新标签页中打开) 的其他选项
use serde_json::{json, Value};
let res = client
.post()
.aggregate_raw::<Vec<Value>>()
.pipeline(json!([
{ "$match": { "title": "Title" } },
{ "$group": { "_id": "$title" } }
]))
.exec()
.await?;