概要

この記事では、JavaScriptやTypeScriptのプロジェクトで使用できる軽量ORM「Drizzle ORM」を用いて、Cloudflareのサーバレスデータベース「Cloudflare D1」に接続する方法を詳しく解説します。Drizzle ORMは、型安全性が高く、直感的なSQLスタイルのクエリ構文で操作できるため、データベース操作を効率的かつ安全に行えます。Cloudflare D1はSQLiteベースのサーバレスデータベースで、特にスケーラビリティが求められるWebアプリケーションに適しています。

Drizzle ORMとは

Drizzle ORMは、JavaScriptとTypeScriptでのデータベース操作を簡単にし、型安全なクエリを可能にするORM(オブジェクトリレーショナルマッピング)ツールです。特徴は以下の通りです。

  • TypeScriptとの相性:型安全な設計により、データベース操作のエラーを事前に防ぎます。
  • 簡単なクエリ構文:SQLに似た構文で、データ操作がしやすい。
  • 効率的で軽量:高速で軽量な設計のため、パフォーマンスも良好です。

Cloudflare D1とは

Cloudflare D1は、Cloudflareのインフラ上で動作するSQLiteベースのサーバレスデータベースです。特徴は以下の通りです。

  • サーバレスでスケーラブル:インフラ管理不要で自動的にスケールします。
  • SQLiteベース:軽量なため、高速かつシンプルに操作可能。
  • Cloudflare Workersと統合可能:フロントエンドから直接アクセスでき、応答速度が早い。 Cloudflare D1とDrizzle ORMを組み合わせることで、スケーラブルでメンテナンスが容易なデータベース管理が可能になります。

Drizzle ORMを用いたCloudflare D1への接続手順

プロジェクトのセットアップ

Drizzle ORMとCloudflare D1を利用するには、まずNode.js環境でプロジェクトを準備します。

# プロジェクトのディレクトリを作成
mkdir drizzle-cloudflare-d1
cd drizzle-cloudflare-d1
# npmプロジェクトの初期化
npm init -y

必要なパッケージのインストール

Cloudflare D1との接続を可能にするため、drizzle-orm@cloudflare/workers-d1パッケージをインストールします。

npm install drizzle-orm @cloudflare/workers-d1
  • drizzle-ormDrizzle ORM本体で、データベースとの操作に利用します。
  • @cloudflare/workers-d1はCloudflare D1に接続するための専用ライブラリです。

Cloudflare D1データベースの作成と設定

Cloudflare D1を使用するには、Cloudflareアカウントが必要です。以下の手順でデータベースをセットアップします。

  1. Cloudflareのダッシュボードにアクセスし、D1データベースを作成。
  2. 作成したD1データベースの「接続文字列」と「APIキー」などの情報を取得。 この接続情報は、Drizzle ORMからCloudflare D1に接続する際に必要となります。

Drizzle ORMとCloudflare D1の接続設定

Drizzle ORMを使用してCloudflare D1に接続するために、取得した接続情報をもとにクライアント設定を行います。以下は設定例です。

// database.js
import { drizzle } from "drizzle-orm";
import { D1Database } from "@cloudflare/workers-d1";
// D1データベースのインスタンスを作成
const d1 = new D1Database({
  binding: "YOUR_D1_DATABASE_BINDING",  // Cloudflareで設定したバインディング名
});
// `Drizzle` ORMの接続を初期化
const db = drizzle(d1);
export default db;

ここで、Cloudflare D1のバインディング(binding)名を指定します。Cloudflare WorkersでD1を使用する際、このバインディング名をデータベースのインスタンスに設定し、dbオブジェクトとして操作できるようにしています。

テーブルのスキーマ定義

Drizzle ORMでは、データベーステーブルのスキーマをTypeScriptの型として定義します。以下はtasksテーブルを定義する例です。

// schema.js
import { sqlTable, sqlColumn } from "drizzle-orm";
// tasksテーブルの定義
export const tasks = sqlTable("tasks", {
  id: sqlColumn("id").int().primaryKey().autoIncrement(),
  title: sqlColumn("title").string().notNull(),
  completed: sqlColumn("completed").boolean().default(false)
});

このtasksテーブルは、idtitlecompletedの3つのフィールドを持っています。それぞれのフィールドに型が設定されており、idは主キー、completedはデフォルト値がfalseに設定されています。

基本的なデータ操作 - 挿入、取得、更新、削除

Drizzle ORMを使用して、Cloudflare D1上のテーブルに対して基本的なデータ操作を行います。

データの挿入

import db from "./database";
import { tasks } from "./schema";
async function insertTask(title) {
  await db.insert(tasks).values({ title });
}

このコードは、tasksテーブルに新しいタスクを挿入します。

データの取得

async function getTasks() {
  const result = await db.select().from(tasks);
  console.log(result);
}

このgetTasks関数は、tasksテーブルからすべてのタスクを取得して、コンソールに表示します。

データの更新

async function updateTask(id) {
  await db.update(tasks)
    .set({ completed: true })
    .where(tasks.id.equals(id));
}

このupdateTask関数は、指定したidを持つタスクのcompletedフィールドをtrueに更新します。

データの削除

async function deleteTask(id) {
  await db.delete(tasks)
    .where(tasks.id.equals(id));
}

このdeleteTask関数は、指定されたidを持つタスクをtasksテーブルから削除します。

Cloudflare Workersでの実行例

Cloudflare D1をCloudflare Workersから操作するには、dbオブジェクトをWorker内で使用します。以下に簡単なWorkerコードの例を示します。

// worker.js
import db from "./database";
import { tasks } from "./schema";
export default {
  async fetch(request) {
    if (request.method === "POST") {
      await db.insert(tasks).values({ title: "New Task" });
      return new Response("Task added", { status: 201 });
    } else if (request.method === "GET") {
      const result = await db.select().from(tasks);
      return new Response(JSON.stringify(result), { status: 200 });
    }
  }
};

このWorkerは、HTTPのPOSTリクエストを受け取った際に新しいタスクを追加し、GETリクエストではtasksテーブルのデータを取得してレスポンスとして返します。

エラー対処とヒント

  1. 接続エラー
    バインディング名や接続情報が間違っていると接続エラーが発生します。設定が正しいことを確認してください。
  2. 型エラー
    Drizzle ORMではTypeScriptの型が必須です。スキーマで定義された型と一致しないデータを挿入しようとするとエラーが発生します。
  3. Workerのリクエスト制限
    Cloudflare Workersでは同時に処理できるリクエスト数に制限があります。多数のリクエストが発生する場合、非同期処理やバッチ処理を検討してください。

まとめ

Drizzle ORMを用いてCloudflare D1に接続することで、型安全なデータ操作が可能です。Cloudflare D1は軽量なSQLiteをベースとしており、スケーラビリティとパフォーマンスに優れています。さらに、Drizzle ORMの型安全なクエリ構文によって、データベース操作の信頼性が向上します。サーバレス環境で効率的にデータを管理したい場合に、Drizzle ORMとCloudflare D1の組み合わせは非常に有用です。