Zenn
🚀

PrismaからDrizzleへ

2025/03/24に公開

なぜDrizzle

  • SQLの自由度
  • 書いたものがそのままSQL化にする

という結論がありましてDrizzleを選ぶようになりました

SQLの自由度

外部キー制約なしでのJOIN

弊社ではわけあって外部キーを使わないようにしてるがJOINを使ったほうがいいケースがよく出てます。Prismaではスキマー上外部キー制約を使わなければJOINをできない。Drizzleの場合スキーマがどんな形であれ勝手にJOINはできます。

特殊のSQLの書き方を関数化する

BULK UPDATEの関数を作るときにどうしてもRAW SQLを使わないといけない。個人的にはDrizzle ORMの方が型推論をつけてるELT(FIELD())の関数が作りやすい。

BULK UPDATEとは

UPDATE employees
SET department_name = ELT(FIELD(department_id, 1, 2, 3, 4),
    'Sales', 'Marketing', 'Engineering', 'HR')
WHERE department_id IN (1, 2, 3, 4);

みたいなクエリーで、一つのクエリーで複数の行に各々の値でUPDATEする

書いたものがそのままSQL化にする

Prismaではcreate, findFirstなどの関数を実行しても一つのクエリーとは限りません。

また、複雑なSQLクエリーをPrismaで表現したい場合、Prismaでの書き方を知らなければなりません。DrizzleではSQLを慣れればPrismaより入門しやすいと思います。

課題になってること

PrismaとDrizzleのスキマーの同期

Drizzleを試す間または移植中では両方のライブラリを同時に使うようになる。そこで低い工数でスキマーを作成するのは一つの課題でした。

方法1:PrismaからDBを反映し、DBスキマーからDrizzleスキマーを作成する

理論上悪くない方法と思っていましたが、生憎drizzle-kitはMySQLのtinyintの認識にはまだバグあるらしいのでdrizzle-kit pullをしてもtinyintimportされてません。手動かスクリプトでimportをしなければなりません。

方法2:DrizzleからDBを反映し、DBスキマーからPrismaスキマーを作成する

こちらの利益としてはDrizzleの細かい設定ができます(例:カスタムの型)。生憎ここもtinyintが未完成らしくてdrizzle-kit pushをする際tinyintがDBに反映されません。

方法3:drizzle-prisma-generatorでDrizzleスキマーを作成する

Drizzle公式が提供してるライブラリが自動でPrismaスキマーからDrizzleスキアーを作成する。この3つの方法を試す時にこれが一番だと思っていました。

Prisma transactionでDrizzleを使う

うちのプロジェクトではtransactionを使ってましたが、その一部はDrizzleを使いたいものの一気に全てをDrizzleに移植すると工数が高い。

ここでDrizzleでDBクライアントを使わないままでクエリービルダーとして使いました。

const sql = dbDrizzle.update(users)
  .set({ name: 'Mr. Dan' })
  .where(eq(users.name, 'Dan'))
  .limit(1)
  .toSQL();
await dbPrisma.$executeRawUnsafe(sql.sql, ...sql.params);

結論

Drizzle ORMはまだalphaステージですが、それでも型推論、SQLの自由または関数化したSQLがとてもいいと思います。みんなも是非Drizzle ORMを使ってみてください!

Discussion

ログインするとコメントできます