Grandream

Grandream

3 min read

ブラウザで動作するSQLite: sql.jsとPrismaを組み合わせた実装

はじめに

ブラウザ上でSQLiteを動作させ、オフラインでもデータベース操作を可能にする方法を紹介します。

この実装では、Prismaを使用してデータベースの構造管理とシーディングを行い、sql.jsを使用してブラウザ上でデータベースを操作します。

実装の概要

  1. Prismaでデータベースのスキーマ定義とマイグレーション
  2. 初期データをBase64エンコードして定数として保存
  3. ブラウザでsql.jsを使用してデータベースを操作

データベースのセットアップ

スキーマ定義


// prisma/schema.prisma
model users {
  id             Int      @id @default(autoincrement())
  name           String
}

シーディング


// prisma/seed.ts
const users = [
  { name: "山田太郎" },
  { name: "鈴木花子" },
  { name: "佐藤次郎" },
];

await prisma.users.createMany({
  data: users,
});



データベースの生成と変換

Prismaで生成したデータベースをBase64エンコードし、定数として保存します:


// src/lib/generateDatabase.ts
export async function generateInitialDatabase() {
  const prisma = new PrismaClient();
  try {
    await prisma.$disconnect();
    const dbFile = fs.readFileSync("prisma/dev.db");
    const db = new DatabaseService();
    await db.initialize();
    await db.loadBinary(new Uint8Array(dbFile));
    return db.export();
  } catch (error) {
    console.error("Error:", error);
    throw error;
  }
}


ブラウザでの使用


// app/(main)/test-db/page.tsx
const [db, setDb] = useState(null);

useEffect(() => {
  const initDb = async () => {
    const dbService = new DatabaseService();
    await dbService.initialize(INITIAL_DB_BASE64);
    setDb(dbService);
  };
  initDb();
}, []);

const handleQuery = () => {
  if (!db) return;
  const result = db.query("SELECT * FROM users");
  console.log(result);
};

制限事項と注意点

  1. Prismaとsql.jsの相互運用性
    • sql.jsで読み込んだデータベースに対してPrismaを使用することはできません
    • Prismaはサーバーサイドでの使用に限定されます
  2. データの更新
    • データベースの更新が必要な場合は、再度マイグレーションとシーディングを実行する必要があります

まとめ

この実装により:

  • オフライン環境でのデータベース操作が可能
  • Prismaの強力なスキーマ管理とマイグレーション機能を活用
  • ブラウザ上でSQLクエリを実行可能

ただし、PrismaとWASM版SQLiteの直接的な連携はできないため、用途に応じて適切な使い分けが必要です。

Grandream

Grandream

株式会社グランドリーム

AI・システム開発のプロフェッショナルチームです。AIエージェント・業務自動化・Webシステム開発などを手がけています。

Grandream の技術力についてご相談ください

記事の内容についての質問・AI活用・システム開発のご相談をお気軽に。

無料で相談する