Prisma 2.0(Beta)の所感
prisma.io がメジャーバージョンアップして2.0(Beta)になったということなので調査しました。
どう変わったか
旧prismaは様々なリソース(DB, API, GraphQL, など)をインテグレーションしてデータアクセスをprismaに集約するという壮大なコンセプトだったと思ったんですが、2.0はType-SafeなRDBのデータアクセスツールへと着地したようです。
Prisma 2.0の構成要素としては主に、@prisma/cli
と@prisma/client
を使っていくことになります。この他にマイグレーションツールやGUIもあるようですがそれはまだExprimentalです。
使い方ですが、まずschema.prisma
というスキーマ定義ファイルにデータモデルなどの情報を記述していきます。GraphQLのschemaっぽい記述の仕方になっています。そして@prisma/cli
でschema.prisma
から型定義を生成します。これが@prisma/client
のパッケージの中に配置されTypeScriptではモデルの型を参照できるようになるという仕組みです。prismaはこの機能をA "smart" node moduleといっています。
prismaは既存のデータアクセスツールととどう違うのか?という点について、以下の記事で説明されています。
Why Prisma? (Comparison with SQL query builders & ORMs)
ORMよりも生産性があり、QueryBuilderよりも(より生のSQLに近い)表現力があるということです。
またその根拠として、ORMやQueryBuilderと比較して以下を挙げています。
- Thinking in objects instead of mapping relational data
- Queries not classes to avoid complex model objects
- Single source of truth for database and application models
- Healthy constraints that prevent common pitfalls and antipatterns
- An abstraction that make the right thing easy ("pit of success")
- Type-safe database queries that can be validated at compile time
- Less boilerplate so developers can focus on the important parts of their app
- Auto-completion in code editors instead of needing to look up documentation
この時点ではまだ懐疑的な気持ちだったので、実際にサンプルを触ってみたりドキュメントを一通り読んでみました。
そして今時点の私の感想は以下のとおりです。
所感
TypeORMと比較して型の表現力はprismaの方が高い
- レスポンスの型が、QueryでSelectしたフィールドやRelationしたテーブルによって都度合成される
- Queryを組み立てるときの型のサポートがとても強力
- 生のSQLのレスポンスにも型を適用できる(!)
TypeORMと比較してQueryの表現力はprismaのほうが高い
- SQLではなくGraphQLっぽい書き方になり、GraphQLに親しんでいると直感的に書ける
- Queryとして必要な機能はほぼ揃っていて実務レベルで問題ない
トランザクションについて
スキーマ定義ファイルの表現力について
Modelのビジネスロジックやvalidationについて
- ModelがプリミティブなObjectなので書けない。別で用意する必要がある。 https://github.com/prisma/specs/issues/353
データアクセスツールとしては既存のものより良いと思うのですが、Modelがclassでないという点をどう解決するかが実装レベルでネックになりそうと思いました。既存のプロジェクトへの組み込みもしやすいので試行錯誤してみたいと思います。