この記事は、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キーワードを使用するというようなことも可能で柔軟にデータを取得できます。