Prismaは非常に良くできたORMで様々なDBをサポートしていて便利なのですが、動作環境の条件によっては生SQLを実行するのと比べて2倍から数倍遅いケース(今回検証したのはサーバー/クライアント間のレイテンシーがそこそこ大きい場合)があり、開発環境では良いのですが本番環境では少々使いづらい場合があります。
そこでPrismaのDB管理機能だけ使いながらテーブルの型情報だけ拝借して生SQLで取得したレコードに型づけして使う方法を紹介します。
使う道具は2つ
- Prisma
- prisma-kysely
Prisma
DBのスキーマの抽出と管理に使います。
pnpm add -SD prisma
したら prisma init
してprisma db pull
してスキーマ情報を生成します。
prisma-kysely
これはPrismaが生成するスキーマ情報を拝借してKyselyで使おうというやつです。
pnpm add -SD prisma-kysely
したら prisma/schema.prisma
ファイルを修正してgeneratorをkyselyのものにします。
generator kysely {
provider = "prisma-kysely"
output = "../src/db"
fileName = "types.ts"
}
こうするとprisma generate
で./src/db/types.ts
に型情報が生成されます。
さて、ここで生成された型情報はkyselyから使うためのもので、kyselyを使うならそのまま使えるのですが、今回は生SQLを自分で書きたいので最後にもうひと工夫必要です。
package.json
に@types/kysely
の項目を追加します。
"devDependencies": {
...
"@types/kysely": "link:./prisma/kysely",
...
}
続いて./prisma/kysely
ディレクトリを作成して中身を以下のように作成します。
$ tree prisma/kysely
prisma/kysely
├── index.d.ts
└── package.json
package.json
{
"name": "kysely",
"version": "1.0.0",
"description": "",
"types": "index.d.ts",
"scripts": {},
"keywords": [],
"author": "Your name",
"license": "ISC"
}
index.d.ts
declare module 'kysely' {
export type ColumnType<A, _1_, _2_> = A;
}
これでprisma-kysely
が生成した型情報をそのまま使えるモック型ができました。
あとはsrc/db/types.ts
からimport type
して使うだけです。
これで何が嬉しいかというと、DBのスキーマ情報が変化してもprisma db pull
してprisma generate
すれば型情報を更新できてそのまま使えるという事ですね。