Persistence

技術メモなど

Prisma 2.0(Beta)の所感

prisma.io がメジャーバージョンアップして2.0(Beta)になったということなので調査しました。

どう変わったか

www.prisma.io

prismaは様々なリソース(DB, API, GraphQL, など)をインテグレーションしてデータアクセスをprismaに集約するという壮大なコンセプトだったと思ったんですが、2.0はType-SafeなRDBのデータアクセスツールへと着地したようです。

Prisma 2.0の構成要素としては主に、@prisma/cli@prisma/clientを使っていくことになります。この他にマイグレーションツールやGUIもあるようですがそれはまだExprimentalです。

使い方ですが、まずschema.prismaというスキーマ定義ファイルにデータモデルなどの情報を記述していきます。GraphQLのschemaっぽい記述の仕方になっています。そして@prisma/clischema.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として必要な機能はほぼ揃っていて実務レベルで問題ない

トランザクションについて

スキーマ定義ファイルの表現力について

  • 複合フィールドのIndex、Unique制約は書ける
  • String型の値をEnumにできる
  • JSON型はサポートしているけど、その中身については型を与えられなさそう

Modelのビジネスロジックやvalidationについて

データアクセスツールとしては既存のものより良いと思うのですが、Modelがclassでないという点をどう解決するかが実装レベルでネックになりそうと思いました。既存のプロジェクトへの組み込みもしやすいので試行錯誤してみたいと思います。