この記事は、Zennにも投稿しています。
概要
prisma-client-rustはJavascript向けのORMであるprismaをRustから使えるようにしたものです。実はprismaのコア部分はRustで書かれているためこういうものも作りやすかったんじゃないかと思います。
セットアップ
まずはプロジェクトを作成します。
cargo new --bin
でバイナリプロジェクトを作成して、Cargo.toml
をこんな感じに編集します。prisma-client-rust
はcrates.ioでは提供されていないため、gitリポジトリを指定する必要があります(参考: https://github.com/Brendonovich/prisma-client-rust/issues/76 )。features
には使用するデータベースの他に他ライブラリとの統合機能を指定できます。ここではpostgresqlとmigration機能を指定しました。個人的に興味深いものとしては
rspc
featureがあります。rspcはRust版trpcみたいなやつで、Rustの型からTypescriptの型を吐き出してフロントエンドで使用することができます。そしてrspc
featureを指定することで必要なものをderiveしてくれるわけです。cliのセットアップ
JS版と同様、prisma cliを使うことになるのでインストールします。公式の手順に従うことでプロジェクトディレクトリ内でのみ
cargo prisma
コマンドを使用することができるようになります。スキーマの作成
次にprismaのスキーマを作成します。プロジェクトディレクトリ直下に
その後
prisma
フォルダを作成し、その中にschema.prisma
とmigrations
フォルダを作成します。その後
cargo prisma generate
を実行することでsrc/prisma.rs
が生成されます。このファイルはデバイス固有のものなので.gitignore
に含めるべきです。Clientの作成
このように
リリースビルドでは
PrismaClient
を作成することでデータベースにアクセスできます。開発時には_db_push
メソッドを使ってschemaの変更を直接反映させます。実際にはaxum
のstateなどにArc<PrismaClient>
として入れることになるでしょう。リリースビルドでは
prisma migrate dev
コマンドを使用してマイグレーション用sqlを生成した上でそれらを適用します。CRUD操作
基本的なことは公式のdocsを見てもらえばわかると思うのでdocsでは説明が足りないなと感じた箇所について記したいと思います。
以下のサンプルコードでは公式のdocsにもある以下の
以下のサンプルコードでは公式のdocsにもある以下の
prisma.schema
を使うことにします。リレーション
prisma-client-rustでは、read時にrelationも含めて取得する方法が2つあります。
1. .with()
とfetch
を使う
ここに載っているやり方です。
このコードのようにwithとfetchを使うことでリレーション先のデータを取得できますがデータが関数の中にあるResultで取得できるので扱いづらいです。
2. include!()
マクロを使用する
Select & Include – Prisma Client Rust
prisma.brendonovich.dev
このマクロは
例えば
include
メソッドに使用できるstructを生成することで型安全かつ簡潔にリレーションの取得を記述することができます。例えば
と記述することで
のようなコードが生成されます。そして
のようなコードを書くことで
post_with_comments::Data
型の値が返ってきます。2のやり型はJSのprismaと同じような書き心地で非常に便利です。正直1の方法を使う必要はあまりないのではないかと感じました。
一部の列のみを取得
先程紹介した
また、includeマクロ内でselectキーワードを使用するというようなことも可能で柔軟にデータを取得できます。
include!()
マクロに似たselect!()
マクロを使用することで一部の列のみを取得することができます。また、includeマクロ内でselectキーワードを使用するというようなことも可能で柔軟にデータを取得できます。