この記事は雑に Claude のログと Gemini に過去の記事を参考に作ったものです。
内容は確認しておりますが、誤りがあるかもしれません ![]()
はじめに
最近は Hono + Drizzle ORM の組み合わせでバックエンドを組むのが楽しくて仕方ない @guppy0356 です。
Drizzle エコシステムの魅力は、ORM(drizzle-orm)、バリデーション(drizzle-zod)、そしてシードデータ生成(drizzle-seed)までが型安全に繋がることですよね。
しかし、その「身内の連携」を信じて drizzle-seed を導入したところ、**「drizzle-seed が生成した UUID を drizzle-zod が拒絶する」**という切ない不整合に遭遇しました。
結論から言うと、現行の安定版(0.x系)でテストデータを作るのはまだ時期尚早で、おとなしく v1 を待つのが正解かもしれません。その理由をまとめます。
発生した現象:UUID v4 の「嘘」を見抜かれる
以下のような、ごく一般的なスキーマと zod バリデーションを定義していました。
// schema.ts
export const entries = pgTable("entries", {
id: uuid("id").primaryKey().defaultRandom(), // UUID v4 を期待
url: text("url").notNull(),
});
// Zod スキーマを自動生成
export const selectEntrySchema = createSelectSchema(entries);
このテーブルに drizzle-seed でデータを流し込み、取得したデータを selectEntrySchema でチェックすると、バリデーションエラーが発生します。
await seed(client, schema, { count: 5 });
// 取得したデータの id をチェックすると...
// ZodError: Invalid UUID
原因:4 ブロック目の「1文字」が仕様を満たしていない
生成された UUID を詳しく解析したところ、原因が判明しました。
-
生成された ID:
391e0c51-4900-4348-108e-88dde65e368b
UUID v4 (RFC 4122) の仕様では、以下のルールが厳格に定められています。
-
3 ブロック目の先頭(13文字目)は、必ず
4であること。 -
4 ブロック目の先頭(17文字目)は、
8, 9, a, bのいずれかであること。
今回 drizzle-seed が生成した値を見ると、4 ブロック目の先頭が 1 になっています。
つまり、drizzle-seed は「UUID っぽい形式の文字列」を作ってはいるものの、RFC 非準拠な値を吐き出していたのです。そりゃ drizzle-zod に怒られるわけです。
GitHub の Issue は「Closed」なのに直っていない謎
調べてみると、この問題はすでに報告されていました。
ステータスは Closed。よし解決したんだな、と思って自分の package.json を見返すと、さらに深い闇に気づきます。
"dependencies": {
"drizzle-orm": "^0.45.1",
"drizzle-seed": "^0.3.1",
"drizzle-zod": "^0.8.3"
}
実はこの修正、v1.0.0-beta 系のラインにのみ投入されており、現行の 0.x 系(安定版)にはバックポートされていないようなのです。
なぜ「v1 を待つべし」なのか
現在、Drizzle チームのリソースは次世代の v1.0 に集中しています。今回の UUID 生成ロジックの刷新もその一環で、**「0.x 系を使っているユーザーは、修正済みの beta ラインに上げるか、自力でなんとかするか」**という二択を迫られています。
しかし、テストデータのためだけにプロジェクト全体を beta 版に上げるのはリスクがあります。かといって、安定版でこの初歩的な不整合が放置されている現状を考えると、drizzle-seed をプロダクションのテスト環境でフル活用するのは、まだ少し早い(時期尚早)と言わざるを得ません。
それでも今使うなら:faker.js で上書きする
v1 の正式リリースまで待てない場合、refine を使って faker.js から正しい UUID v4 を供給してあげるのが唯一の回避策です。
import { seed } from "drizzle-seed";
import { faker } from "@faker-js/faker";
await seed(client, schema, {
count: 5,
}).refine((f) => ({
entries: {
columns: {
// drizzle-seed 任せにせず、faker で正しい UUID を生成する
id: f.valuesFromArray({
values: Array.from({ length: 10 }, () => faker.string.uuid()),
isUnique: true,
}),
},
},
}));
まとめ
Drizzle は進化のスピードが速い分、メジャーバージョンアップ直前はエコシステム内でこのような「歪み」が生じやすい時期でもあります。
-
drizzle-seed0.x の UUID 生成は RFC 非準拠 - 修正は
v1.0.0-beta以降にしか入っていない - 安定した開発体験を求めるなら、
drizzle-seedの本格導入はv1を待つのが賢明
「型安全」を掲げるツールだからこそ、身内同士のバリデーションエラーには一番敏感でありたいものですね。
動作確認環境
- drizzle-orm: 0.45.1
- drizzle-seed: 0.3.1
- drizzle-zod: 0.8.3
- Node.js: 22.x