0.2.1 2022年3月1日
0.2.0 2022年2月28日
0.1.2 2021年5月25日
0.1.1 2021年5月25日
0.1.0 2021年5月25日

#5 in #prisma

MIT 协议

12KB
84 代码行

Prima客户端Rust

Latest package version is 0.2.1 Supported Prisma version is 3.9.1

一个舒适且自动生成的数据库客户端,它利用Prisma模式。

安装

  1. 创建Prisma模式迁移您的数据库
  2. 安装prisma-client-rust CLI
    cargo install prisma-client-rust
    
  3. 安装prisma-client-rust
    • 如果您已安装cargo-edit,运行cargo add prisma-client-rust
    • 如果没有,请在Cargo.toml中将以下内容作为依赖项添加:prisma-client-rust = "0.2.1'
  4. prisma-client-rust添加到您的Prisma模式中作为生成器
    generator client {
        provider = "prisma-client-rust"
        // The folder that files should be generated to, relative to your schema file
        output = "./db"
    }
    
  5. 在终端中运行prisma-client-rust generate以生成rust模块
  6. 在您的代码中包含生成的模块并连接新的Prisma客户端
    // Name of the module will be the folder specified in the generator's 'output'
    pub mod db;
    
    use db::{PrismaClient}
    
    // Any async runtime can be used, tokio is just an example
    #[tokio::main]
    async fn main() {
        let client = PrismaClient::new();
    
        await client.engine.connect();
    }
    

查询

以下示例使用此模式

datasource db {
    provider = "postgresql"
    url      = env("DATABASE_URL")
}

generator client {
    provider      = "prisma-client-rust"
    binaryTargets = ["native"]
    output        = "../src/db"
}

model User {
    username    String @id
    displayName String

    posts           Post[]
    comments        Comment[]
}

model Post {
    id      String @id
    content String

    comments Comment[] @relation()

    User         User?   @relation(fields: [userUsername], references: [username])
    userUsername String?
}

model Comment {
    id String @id

    postId String
    post   Post   @relation(fields: [postId], references: [id])

    User         User?   @relation(fields: [userUsername], references: [username])
    userUsername String?
}

查找

pub mod db::{Post};

#[tokio::main]
async fn main() {
    let mut client = PrismaClient::new();

    client.engine.connect();

    // Find a single record using a unique field
    let unique_user = client
        .user()
        .find_unique(User::username().equals("some user".to_string()))
        .exec()
        .await;

    // Find the first record that matches some parameters
    let first_user = client
        .user()
        .find_first(vec![User::username().contains("user".to_string())])
        .exec()
        .await;

    // Find all records that match some parameters
    let many_users = client
        .user()
        .find_many(vec![
            // Querying on relations is also supported
            User::posts().some(vec![Post::content().contains("content".to_string())]),
        ])
        .exec()
        .await;
}

创建

pub mod db::{PrismaClient, User, Post};

#[tokio::main]
async fn main() {
    let mut client = PrismaClient::new();

    client.engine.connect();

    // Required values are passed in as separate arguments
    let user = client
        .user()
        .create_one(
            User::username().set("user0".to_string()),
            User::display_name().set("User 0".to_string()),
            // Optional arguments can be added in a vector as the last parameter
            vec![],
        )
        .exec()
        .await;

    let post = client
        .post()
        .create_one(
            Post::id().set("0".to_string()),
            Post::content().set("Some post content".to_string()),
            // Relations can be linked by specifying a where query
            Post::user().link(User::username().equals(user.username.to_string())),
            vec![],
        )
        .exec()
        .await;
}

删除

pub mod db::{PrismaClient, User, Post};

#[tokio::main]
async fn main() {
    let mut client = PrismaClient::new();

    client.engine.connect();

    // Delete a single record matching a given condition
    // (also works with find_unique)
    client
        .post()
        .find_unique(Post::id().equals("0".to_string()))
        .delete()
        .exec()
        .await;

    // Delete many records matching given conditions
    // (In this case, deletes every user)
    client
        .user()
        .find_many(vec![])
        .delete()
        .exec()
        .await;
}

依赖

~7–23MB
~329K SLoC