はじめに
ブラウザ上でSQLiteを動作させ、オフラインでもデータベース操作を可能にする方法を紹介します。
この実装では、Prismaを使用してデータベースの構造管理とシーディングを行い、sql.jsを使用してブラウザ上でデータベースを操作します。
実装の概要
- Prismaでデータベースのスキーマ定義とマイグレーション
- 初期データをBase64エンコードして定数として保存
- ブラウザで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);
};
制限事項と注意点
- Prismaとsql.jsの相互運用性- sql.jsで読み込んだデータベースに対してPrismaを使用することはできません
- Prismaはサーバーサイドでの使用に限定されます
 
- データの更新- データベースの更新が必要な場合は、再度マイグレーションとシーディングを実行する必要があります
 
まとめ
この実装により:
- オフライン環境でのデータベース操作が可能
- Prismaの強力なスキーマ管理とマイグレーション機能を活用
- ブラウザ上でSQLクエリを実行可能
ただし、PrismaとWASM版SQLiteの直接的な連携はできないため、用途に応じて適切な使い分けが必要です。
株式会社Grandreamでは、フルリモートであなたのスキルを活かし、活躍できるエンジニアを募集しております。
詳しくは採用ページをご確認いただき、お気軽にお問い合わせください。