Skip to content

drizzle-team/drizzle-orm

URL: https://github.com/drizzle-team/drizzle-orm Stars: 33.1k | 言語: TypeScript | ライセンス: Apache-2.0 | 分析日: 2026-03-04

サマリー

drizzle-orm は TypeScript の型システムを限界まで活用した SQL ファースト ORM であり、20 以上のデータベースドライバを単一パッケージ内で 4 層レイヤードアーキテクチャと HKT エミュレーションにより型安全に束ねている。declare 幽霊プロパティによるゼロコスト型メタデータ、Symbol.for ベースの cross-bundle 型識別、タグ付きテンプレートリテラルによる SQL チャンク合成など、TypeScript ライブラリ設計の先端的なプラクティスが凝縮されており、マルチバックエンド対応ライブラリの設計リファレンスとして極めて高い価値を持つ。

技術スタック

  • 言語: TypeScript
  • ビルド: tsup, Turborepo
  • テスト: Vitest, Docker ベース統合テスト, PGlite
  • パッケージマネージャ: pnpm (workspace)
  • リンター/フォーマッター: dprint, ESLint (カスタムプラグイン含む)
  • 型チェック: TypeScript 5.6.3 (strict mode)
  • CI/CD: GitHub Actions, @arethetypeswrong/cli (attw)

分析した視点

#視点ファイル概要
1project-structureproject-structure.mdファットコアパッケージ戦略とサブパスエクスポート自動生成で20+ドライバを単一パッケージに統合
2architecturearchitecture.mdcore/dialect/session/driverの4層レイヤードアーキテクチャでHKTと抽象クラスにより型安全なドライバ差し替えを実現
3design-philosophydesign-philosophy.mdSQL構文との1:1対応・0依存・declare型メタデータ・エスケープハッチ提供という4原則で型安全ORM を設計
4type-system-patternstype-system-patterns.mddeclare幽霊プロパティ・交差型による型状態累積・HKTエミュレーション・DrizzleTypeErrorで型推論チェーンを構築
5adapter-implementation-patternsadapter-implementation-patterns.mdDialect/Session/PreparedQueryの3層抽象とNullObjectパターンで20+ドライバの差異を統一的に吸収
6composition-patternscomposition-patterns.mdSQLWrapperインターフェースによる統一合成とOmitベースの型状態制御でFluent APIの安全性を保証
7database-patternsdatabase-patterns.mdテーブル定義を型の単一ソースとし、Session層でドライバを隠蔽しTransaction継承で同一APIを提供
8schema-validation-patternsschema-validation-patterns.md4バリデーションライブラリを同型構造で並列管理しConditionsオブジェクトでselect/insert/updateの差分を宣言的に制御
9migration-patternsmigration-patterns.mdSerialize→Snapshot→Squash→Diff→JSON Statements→SQLの6段パイプラインでZodバージョン管理付きIRを介した方言横断マイグレーション
10api-design-practicesapi-design-practices.mdビルド時exports自動生成・Symbol.forによる内部API隠蔽・$プレフィックス規約で444ファイルのAPI表面を統制
11error-handling-idiomserror-handling-idioms.md3クラスのフラットなエラー階層・DrizzleTypeErrorによる型レベルエラー・ESLintプラグインの三層防御
12testing-practicestesting-practices.md全テストを実DB統合テストとし共通テスト関数を10+ドライバで再利用、型テストをランタイムテストにインライン配置
13build-and-toolingbuild-and-tooling.mdtsup+tsc並列ビルド・ASTベースのCJS/ESMパス修正・attwによる型正当性ゲートでデュアルパブリッシュを自動化
14performance-techniquesperformance-techniques.mdPrepare/Execute分離・バッチパイプライン・NullObjectキャッシュ・テーブルベース自動無効化でゼロコスト抽象を実現
15dependency-managementdependency-management.md全25+ドライバをoptional peer depsにしworkspace:dist参照とSymbol.forで公開後と同一条件の開発環境を構築
16metaprogramming-techniquesmetaprogramming-techniques.mdZodスキーマ付きバージョン管理IRを軸にDB→中間表現→TypeScriptコードの3層コード生成パイプラインを構築
17sql-template-abstractionsql-template-abstraction.mdタグ付きテンプレートでSQLをチャンク配列として保持しSQLWrapper統一インターフェースとundefinedスキップで宣言的合成を実現
18dialect-normalization-patternsdialect-normalization-patterns.md並列ミラーディレクトリ構造と型タグベースの方言分離で共通APIを維持しつつ方言固有機能を型安全に提供

特に注目すべき知見

  • declare 幽霊プロパティによるゼロコスト型メタデータ: declare readonly _: パターンで全主要クラスに型情報を保持し、JavaScript 出力に一切影響させずに $inferSelect / $inferInsert の型導出チェーンを実現する。バンドルサイズとコンパイル時型安全性を両立するテクニックとして、TypeScript ライブラリ全般に応用可能。

  • Symbol.for + ESLint 強制による cross-bundle 型識別: instanceof がバンドラーやモノレポ環境で壊れる問題を、Symbol.for('drizzle:entityKind') によるグローバルシンボル + プロトタイプチェーン走査の is() 関数で解決する。カスタム ESLint ルールで全クラスへの entityKind 付与を機械的に強制し、ヒューマンエラーを排除する。npm パッケージを公開するライブラリで広く活用できるパターン。

  • タグ付きテンプレートリテラル + undefined スキップによる宣言的 SQL 合成: SQL をチャンク配列として構造化し、undefined チャンクを自動スキップすることで、条件分岐なしに動的クエリを組み立てる。and() / or()undefined 自動フィルタと組み合わせることで、複雑な動的 WHERE 句をフラットに記述できる。DSL 設計全般に応用可能。

  • Null Object パターンによるゼロコスト横断的関心事: Logger/Cache/Tracer を全て NoopLogger / NoopCache でデフォルト無効化し、利用側のコードに条件分岐を一切持ち込まない。20 以上のドライバアダプターが同一コード構造を維持でき、オプショナル機能の追加が既存コードに影響しない。

  • CJS/ESM デュアルパブリッシュの完全自動化パイプライン: ソースファイル glob からの exports map 自動生成、AST ベースのインポートパス書き換え、ステージングディレクトリによるアトミックスワップ、@arethetypeswrong/cli による CI ゲートを組み合わせた、大規模ライブラリの CJS/ESM デュアルパブリッシュのリファレンス実装。

クイックリファレンス