PrismaからDrizzleへ
なぜ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
をしてもtinyint
がimport
されてません。手動かスクリプトでimport
をしなければなりません。
方法2:DrizzleからDBを反映し、DBスキマーからPrismaスキマーを作成する
こちらの利益としてはDrizzleの細かい設定ができます(例:カスタムの型)。生憎ここもtinyint
が未完成らしくてdrizzle-kit push
をする際tinyint
がDBに反映されません。
drizzle-prisma-generator
でDrizzleスキマーを作成する
方法3: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