Cover Image for prisma-client-rust を試してみる

prisma-client-rust を試してみる

概要

Rust で DB 接続を試してみる。DBスキーマの管理とかは prisma 使いたいので、探してみたところ 非公式だが prisma-client-rust を見つけたので試してみる。

余談だが、 2022/08/24 に 0.5.3 が出るまでまともに動かなかった。

これはタイミング悪く 2022/08/22 に 0.5.2 を試してしまった時の嘆き

検証結果

  • 最低限動かすことはできる
  • 少し複雑な schemaだとclientの生成に失敗するのでまだ趣味で使うにしても早そう。
  • 2022/08 末に 0.6.0 を出すらしいので待つ

検証メモ

最終的なフォルダ構成

|---- .cargo
|      `---- config.toml
|
|---- prisma
|      `---- schema.prisma
|
|---- prisma-cli  
|     |---- src
|     |     `---- main.rs
|     `---- Cargo.toml
|
|---- repositories
|     |---- src
|     |     `---- lib.rs
|     `---- Cargo.toml
|
|---- .env
`---- Cargo.toml

cargo workspaces を使った構成で最終的にはこのような構成を作る。 ここからは ドキュメント に沿ってやっていく

01-Installation

まず Rust 用の prisma-cli を binary-crate としてを作る

$ cargo new prisma-cli 

作成完了したら Cargo.toml に以下のような dependencies を設定する

############################
# ./prisma-cli/Cargo.toml
############################

[package]  
name = "prisma-cli"  
version = "0.1.0"  
edition = "2021"  
  
  
[dependencies]  
prisma-client-rust = { git = "https://github.com/Brendonovich/prisma-client-rust", tag = "0.5.3" }  
prisma-client-rust-cli = { git = "https://github.com/Brendonovich/prisma-client-rust", tag = "0.5.3" }

設定終わったら main.rs を以下のように書き換える

//
// ./prisma-cli/src/main.rs
//

fn main() {  
    prisma_client_rust_cli::run();  
}

これで準備は完了。 作成した crate を root にある Cargo.toml に追加しておく

############################
# ./Cargo.toml
############################

[workspace]  
  
members = [  
    "prisma-cli",  
]

この状態で、一旦作った prisma-cli が動作するか確認してみる

$ cargo run --bin prisma-cli -- -h

で cli の help が表示されれば問題なし。

このままだと使いづらいので、aliasを設定しておく

############################
# ./cargo/config.toml
############################

[alias]  
prisma = "run --bin prisma-cli --"

設定が終わったら以下を実行してみる。 help が表示されれば問題なし。

$ cargo prisma -h

02-Setup

prisma の schema ファイルを作成しておく

//
// ./prisma/schema.prisma
//

generator client {  
  provider = "cargo prisma"  
  output   = "../repositories/src/prisma.rs"  
}  
  
datasource db {  
  provider = "postgresql"  
  url      = env("DATABASE_URL")  
}  
  
model User {  
  id          String   @id @default(cuid())  
  displayName String  
  email       String?  
}

generate 先の lib-crate を作っておく

$ cargo new --lib repositories 

prisma-client を generate しておく

$ cargo prisma generate

./repositories/src/prisma.rs に client が生成されるので確認しておく。

ついでに接続先の設定を書いておく。supabase などで postgresql を作っておいくとよい。

############################
# .env
############################
  
DATABASE_URL="TODO:ここにURLを入れる"

DB も migrate しておく

$ cargo prisma migrate dev --name init 

03-Overview

lib.rs の方に cliet を読み込めるか試してみる。その前に tokio への依存を追加しておく

############################
# ./repositories/Cargo.toml
############################

[dependencies]  
tokio = { version = "1.20.1", features = ["full"] }
prisma-client-rust = { git = "https://github.com/Brendonovich/prisma-client-rust", tag = "0.5.3" }  
prisma-client-rust-cli = { git = "https://github.com/Brendonovich/prisma-client-rust", tag = "0.5.3" }

こんな感じで、client を生成して、クエリが実行できる

mod prisma;  
  
use prisma::user;  
  
#[tokio::main]  
async fn main() {  
    let client= prisma::new_client().await?;  
    let users = client.user()  
        .find_many(vec![user::display_name::equals("homura".to_string())])  
        .exec().await?;  
}

あとは必要に応じて実装していけばいい。 このあと色々試したが、少し複雑な schemaだとclientの生成に失敗するのでまだ趣味で使うにしても早そう。2022/08 末に 0.6.0 を出すらしいのでそれに期待。