1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Drizzle でテストデータをつくるのは v1 を待つべし 〜 RFC 非準拠な UUID に泣かされないために 〜

Posted at

この記事は雑に Claude のログと Gemini に過去の記事を参考に作ったものです。
内容は確認しておりますが、誤りがあるかもしれません :pray:

はじめに :fish:

最近は 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) の仕様では、以下のルールが厳格に定められています。

  1. 3 ブロック目の先頭(13文字目)は、必ず 4 であること。
  2. 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-seed 0.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
1
0
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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?