额外
原始查询

原始查询

有时 Prisma Client Rust 公开的函数无法表达您需要的查询。在这种情况下,您可以使用客户端的原始查询功能向您的数据库发送任意查询。

关系型数据库

_query_raw_execute_raw 可用于向您的数据库发送原始 SQL,并带有完全消毒的参数。

The prisma_client_rust::raw 宏将 SQL 查询作为其第一个参数,后跟类型为 prisma_client_rust::PrismaValue 的查询变量。要指定在查询中插入变量的位置,请使用 {}。Prisma Client Rust 将负责为您插入正确的数据库特定变量标识符。

尽管 raw 看起来类似于 formatprint,但它不会在编译时验证您提供的变量数量是否与查询中的 {} 数量匹配。这只会发生在运行时。

如果要提供的参数是动态构建的,因此无法在 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 数据库命令 (在新标签页中打开)

使用此查询时有一些规则,这些规则在 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

返回给定模型的实际数据库记录。

方法

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

返回给定模型的聚合数据库记录。

方法

use serde_json::{json, Value};
 
let res = client
	.post()
	.aggregate_raw::<Vec<Value>>()
	.pipeline(json!([
		{ "$match": { "title": "Title" } },
		{ "$group": { "_id": "$title" } }
	]))
	.exec()
	.await?;