Prismaのgeneratorが便利すぎた
はじめに
新規開発のアーキテクチャにT3-Turbo、ORMにPrismaを採用しています。PrismaのGenerator機能を新規開発で導入しました。積極的に使われている印象はないですが、基本的でかなり便利な機能だったので、紹介したいと思います。
公式ページは以下になります。
便利なgenerator
個人的に「これは便利だな」と思ったgeneratorを挙げていきます。
- prisma-erd-generator:エンティティ関係図を生成します。
- prisma-docs-generator:Prisma Clientの個別のAPIリファレンスを生成します。
補助的機能が充実してますね。ERD生成は記事にしてる人も多かったです。
- prisma-joi-generator:Prismaスキーマから完全なJoiスキーマを生成します。
- prisma-yop-generator:Prismaスキーマから完全なYupスキーマを生成します。
- prisma-zod-generator:Prismaスキーマから完全なZodスキーマを生成します。
スキーマ定義とバリデーションは自動生成されるのか!これで世界は平和に保たれる。
- typegraphql-prisma:Prisma モデルの TypeGraphQL CRUD リゾルバーを生成します。
- nexus-prisma:GraphQL Nexus を介して Prisma モデルを GraphQL に投影できるようにします。
- prisma-generator-pothos-codegen:入力タイプ (引数として使用するため) を自動生成し、分離されたタイプセーフなベース ファイルを自動生成することで、Prisma スキーマから Pothos のカスタマイズ可能なオブジェクト、クエリ、ミューテーションを簡単に作成できます。オプションで、ベース ファイルからすべてのクラッドを一度に生成します。
実装の面倒なCode-FirstなGraphQLも、だいぶラクになりそう。
- prisma-generator-express:Express CRUDおよびRouterジェネレーター機能を生成します。
- prisma-nestjs-graphql:@nestjs/graphqlモジュールで使用するためにPrisma スキーマからオブジェクト タイプ、入力、引数などを生成します。
- prisma-generator-nestjs-dto:NestJSリソースと @nestjs/swaggerで使用するリレーション接続および作成オプションを使用してDTOクラスとエンティティクラスを生成します
- nestjs-prisma-graphql-crud-gen:NestJSとPrismaを使用してGraphQLスキーマからCRUDリゾルバーを生成します。
バックエンドTSのフレームワークにExpressかNestJSを選択したそこのあなた、もはや神様に愛されている。人類はCRUD生成から解放されました。
実践編
zodを導入することになったので、prisma-zod-generatorをインストールしてみましょう。T3-Turboを前提としているので、適宜Turborepo内での動きとして読み替えてください。T3-Turboについては以下の記事で解説しています。
まずは必要なライブラリをpackages/database内にインストールします。(パッケージ管理ツールはpnpm)
$ pnpm install zod prisma-zod-generator --filter=database
prismaの定義ファイルに、インストールしたgeneratorを追加します。
generator zod {
provider = "prisma-zod-generator"
isGenerateSelect = true
isGenerateInclude = true
}
対象のフォルダでgenerateします。
$ cd pakagages/database
$ npx prisma generate
というわけで/generatedフォルダ配下にファイルがたくさん出来上がります。このPRが通れば世界が平和になるはずです。
30個のテーブルスキーマに対して2000弱のファイルが出来上がり、Macbook Pro M3 Maxも悲鳴をあげているようです。
フィシルコムのテックブログです。マーケティングSaaSを開発しています。 マイクロサービス・AWS・NextJS・Golang・GraphQLに関する発信が多めです。 カジュアル面談はこちら(ficilcom.notion.site/bbceed45c3e8471691ee4076250cd4b1)から
Discussion