1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Prismaとprisma-kyselyを使って型情報だけ生成してSQLは自分で書く方法

Last updated at Posted at 2024-08-11

Prismaは非常に良くできたORMで様々なDBをサポートしていて便利なのですが、動作環境の条件によっては生SQLを実行するのと比べて2倍から数倍遅いケース(今回検証したのはサーバー/クライアント間のレイテンシーがそこそこ大きい場合)があり、開発環境では良いのですが本番環境では少々使いづらい場合があります。
そこでPrismaのDB管理機能だけ使いながらテーブルの型情報だけ拝借して生SQLで取得したレコードに型づけして使う方法を紹介します。
使う道具は2つ

  1. Prisma
  2. 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すれば型情報を更新できてそのまま使えるという事ですね。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?