prisma-client-rust を試してみる
この記事は最終更新日から2年以上が経過しています。
概要
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
を出すらしいのでそれに期待。