Site icon image World Hacker(ぎょうざブログ)

Think Different, Connect Dots for Line.

【Tips - Drizzle】実例でわかるシリーズ

<前置き、挨拶>

みなさんどうも、こんばんみ~。ぎょうざです。

Webアプリ上などでデータベースとのやりとりを実装する際に便利なツール

Drizzle(ドリズル)を利用する際に、ぎょうざが躓いたところを備忘録として記録しておきます。

同じようなケースあるいは現象で困っている方の参考になれば幸いです。

【目次】

<Useful>

▶ 対応するデータベース(2023/06/25時点)
Image in a image block

▶特徴(Pros. Cons.)

  • 型完全なデータベース操作ができます
  • 開発ライブラリに非依存です
  • 自動でマイグレーションを生成してくれます
  • Zodスキーマ生成ができます
  • テーブル定義とクエリのためのSQLライクなシンタックスです
  • レコード選択と挿入を別々に行うDBモデルのためのTS型の自動インファリングができます
  • SQL関連の学習コストがやや高めです

▶ Supabaseデータベースとの接続(Transaction ModeとSession Modeの使い分け)

重要と思うポイントのみ

  • .envファイルのDATABASE_URL には Transaction Mode のコネクションURI、 DIRECT_URL には Session Mode のコネクションURL
  • Transaction Mode では pgbouncer=true を環境変数としてURL内に追記することを推奨
  • 開発環境の Transaction Mode では更に connection_limit=1 も指定することを推奨

Supabase上でデータベースをPostgreSQLで作成した場合のDATABASE_URL例:

postgresql://[データベースのUser]:[データベースのPassword]@[データベースのHost]:[Port]/postgres?pgbouncer=true&connection_limit=1

▶ Drizzle ORM & Neon: サーバーレスDBとの甘美なる接続
  • 有用性: 型安全なデータベースアクセスと、サーバーレスPostgreSQLによるスケーラブルなデータストアの実現。
  • 根拠: Drizzle ORMはTypeScriptとの親和性が非常に高く、スキーマ定義から型が自動生成されるため、開発効率と安全性が向上する。Neonはサーバーレスアーキテクチャで、従量課金制やブランチ機能など、モダンな開発に適した機能を提供する。
  • 具体例:
  1. セットアップ: drizzle-orm, postgres (ローカル/マイグレーション用), @neondatabase/serverless (Edge用HTTPドライバ), drizzle-kit (マイグレーションツール), dotenv をインストール。
  2. drizzle.config.ts: スキーマファイルのパス、マイグレーション出力先、DB接続情報(環境変数 DATABASE_URL を参照)を設定。
  3. db/schema.ts: Drizzleの pgTable などを使ってテーブルスキーマをTypeScriptで定義(例: learnedWordsTable)。
  4. db/index.ts:
    • Edge Runtime用: @neondatabase/serverlessneon 関数と drizzle-orm/neon-httpdrizzle 関数を使ってDBクライアントを初期化。これがCloudflare Pages/Workers上で動作するAPIからの接続方法。
    • Node.js環境用 (マイグレーション時など): postgres ライブラリと drizzle-orm/postgres-jsdrizzle 関数を使ってクライアントを初期化。これは drizzle.config.ts が参照する(マイグレーションは通常ローカルのNode.js環境で行うため)。
  5. マイグレーション: package.jsondb:generatedb:migrate スクリプトを追加。npm run db:generate でスキーマ変更からマイグレーションファイルを生成し、npm run db:migrate でデータベースに適用。
    • Tips: Neonのブランチ機能を活用し、開発用ブランチと本番用ブランチを分離。開発用ブランチでスキーマ変更を安全にテストし、問題なければ本番にマイグレーションを適用する。環境変数 DATABASE_URL を接続先のブランチに応じて切り替える。

<Error>

<Warn>

〆の一言

Drizzleは、データベースとやり取りする中間ツールとして、とても優秀です!
Edge Computingに対応してい、簡単なデータベース操作が可能になります。

ここまで読んでいただき、ありがとうございました。

以上、ぎょうざでした。