概要

この記事では、Drizzle ORMを使用してVercel Edge Functions上でSQLiteデータベースに接続し、効率的にデータ操作を行う方法を解説します。Drizzle ORMは、JavaScriptやTypeScriptのプロジェクトで使える型安全なORMであり、Vercel Edge Functionsのような高速なサーバレス環境でも柔軟に利用できます。Vercel Edge Functionsを利用することで、ユーザーに対して迅速にデータを提供する高パフォーマンスなアプリケーションが構築可能です。

Vercel Edge FunctionsとDrizzle ORMの概要

Vercel Edge Functionsとは

Vercel Edge Functionsは、Vercelのエッジサーバー上でコードを実行できるサーバレス機能です。次の特徴があります。

  • 高速な応答速度:エッジサーバーで処理が行われるため、ユーザーへのレスポンスが迅速。
  • サーバレススケーリング:リクエストに応じて自動でスケールし、インフラ管理が不要。
  • グローバル分散:Vercelのエッジネットワークを利用して、世界中のユーザーに対して高いパフォーマンスを提供。

Drizzle ORMとは

Drizzle ORMは、TypeScriptとの連携が強みの型安全なORMで、SQLiteなどのデータベース操作が簡単に行えます。SQLライクなクエリ構文で、直感的なデータ操作が可能です。TypeScriptを活用することで、データベースの型に合わせた安全なコードが書けるため、エラーの少ない開発が可能になります。

Vercel Edge FunctionsでのDrizzle ORMとSQLiteの接続手順

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

まず、Vercel CLIをインストールしていない場合は、以下のコマンドでインストールします。

npm install -g vercel

新しいVercelプロジェクトを作成し、作業ディレクトリに移動します。

vercel init drizzle-vercel-sqlite
cd drizzle-vercel-sqlite

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

Drizzle ORMとbetter-sqlite3をインストールします。better-sqlite3はNode.jsで高速なSQLite接続を提供するライブラリです。

npm install drizzle-orm better-sqlite3
  • drizzle-orm:型安全なORMで、SQLiteの操作を効率的に行えます。
  • better-sqlite3:Edge Functionsでも高パフォーマンスなSQLite接続が可能です。

Drizzle ORMとSQLiteの接続設定

Drizzle ORMを用いてSQLiteデータベースに接続するため、データベースインスタンスを作成し、Drizzle ORMを初期化します。次に示すように、database.jsファイルを作成し、データベースの接続設定を記述します。

// database.js
import { drizzle } from "drizzle-orm";
import Database from "better-sqlite3";
// SQLiteデータベースをセットアップ
const sqlite = new Database("edge-data.db");
// `Drizzle` ORMのインスタンスを生成
const db = drizzle(sqlite);
export default db;

ここでは、edge-data.dbというローカルのSQLiteデータベースファイルを使用しています。このファイルは、プロジェクトディレクトリに保存され、データの永続化に使用されます。

テーブルのスキーマ定義

Drizzle ORMを使って、SQLiteデータベース内のテーブル構造を定義します。例えば、usersというテーブルを定義するには、次のコードをschema.jsファイルに記述します。

// schema.js
import { sqlTable, sqlColumn } from "drizzle-orm";
// usersテーブルのスキーマ
export const users = sqlTable("users", {
  id: sqlColumn("id").int().primaryKey().autoIncrement(),
  name: sqlColumn("name").string().notNull(),
  email: sqlColumn("email").string().unique().notNull()
});

このテーブル定義では、usersテーブルにidname、およびemailフィールドを含めており、idは自動インクリメントの主キー、emailは一意制約を持つ文字列です。

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

Drizzle ORMを使用して、SQLiteデータベースに対する基本的なデータ操作を行います。以下は、データの挿入、取得、更新、削除の各操作のサンプルコードです。

データの挿入

import db from "./database";
import { users } from "./schema";
async function insertUser(name, email) {
  await db.insert(users).values({ name, email });
}

この関数は、usersテーブルに新しいユーザーを挿入するものです。

データの取得

async function getUsers() {
  const result = await db.select().from(users);
  return result;
}

getUsers関数は、すべてのユーザー情報を取得して返します。

データの更新

async function updateUser(id, newName) {
  await db.update(users)
    .set({ name: newName })
    .where(users.id.equals(id));
}

updateUser関数は、指定したidのユーザー名をnewNameに更新します。

データの削除

async function deleteUser(id) {
  await db.delete(users)
    .where(users.id.equals(id));
}

deleteUser関数は、指定されたidのユーザーを削除します。

Vercel Edge Functionsでのデータベース操作

Vercel Edge Functionsを使って、Drizzle ORMとSQLiteによるデータ操作を実装します。以下に、エッジ関数でユーザーリストを取得する例を示します。

// api/get-users.js
import db from "../database";
import { users } from "../schema";
export default async function handler(request) {
  const result = await db.select().from(users);
  return new Response(JSON.stringify(result), {
    headers: { "Content-Type": "application/json" },
  });
}

このget-usersエッジ関数は、usersテーブルの全データをJSON形式でレスポンスとして返します。

Vercelにデプロイ

コードが完成したら、以下のコマンドでVercelにデプロイします。

vercel deploy

デプロイ後、APIエンドポイントが生成され、https://your-deployment-url.vercel.app/api/get-usersでユーザーリストが取得できるようになります 。

エラー対処と注意点

  1. SQLiteファイルのパス
    SQLiteはローカルファイルベースのデータベースであるため、ファイルパスの指定が重要です。Edge Functionsの環境に適したパスを指定し、ファイルが正しく作成されるよう確認してください。
  2. 型エラー
    Drizzle ORMは型安全性が特徴です。スキーマと一致しないデータを操作するとエラーが発生するため、TypeScriptの型チェックを活用してミスマッチを防ぎましょう。
  3. 非同期処理の管理
    エッジ関数では、リクエストごとにデータベース操作を非同期で行う必要があります。非同期処理の完了を待たずにデータにアクセスすると、意図しない動作が発生する可能性があるため注意が必要です。

まとめ

Drizzle ORMとVercel Edge Functionsを組み合わせることで、型安全で高速なデータベース操作が可能になります。Edge Functions上でのSQLiteの利用は、グローバルなエッジネットワークによる高速なレスポンスを提供し、Drizzle ORMのシンプルで安全なクエリ構文により、開発効率も向上します。サーバレス環境でのデータ操作が求められるアプリケーションにおいて、Drizzle ORMとVercel Edge Functionsの組み合わせは非常に効果的です。