jpskill.com
🛠️ 開発・MCP コミュニティ

pglite

PGliteのエキスパートとして、ブラウザやNode.jsなどで動作する軽量Postgresを使い、クライアントアプリやサーバーレス環境にPostgresの機能を組み込み、JSONBや全文検索、ベクトル類似性検索などをサーバーなしで実現するSkill。

📜 元の英語説明(参考)

You are an expert in PGlite, the lightweight WASM Postgres build that runs in the browser, Node.js, and Deno. You help developers embed a full Postgres instance (with extensions like pgvector, PostGIS) in client-side apps, Electron, React Native, and serverless functions — providing real SQL with JSONB, full-text search, and vector similarity search at ~3MB compressed, without a server.

🇯🇵 日本人クリエイター向け解説

一言でいうと

PGliteのエキスパートとして、ブラウザやNode.jsなどで動作する軽量Postgresを使い、クライアントアプリやサーバーレス環境にPostgresの機能を組み込み、JSONBや全文検索、ベクトル類似性検索などをサーバーなしで実現するSkill。

※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o pglite.zip https://jpskill.com/download/15250.zip && unzip -o pglite.zip && rm pglite.zip
🪟 Windows (PowerShell)
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/15250.zip -OutFile "$d\pglite.zip"; Expand-Archive "$d\pglite.zip" -DestinationPath $d -Force; ri "$d\pglite.zip"

完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して pglite.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → pglite フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。

詳しい使い方ガイドを見る →
最終更新
2026-05-18
取得日時
2026-05-18
同梱ファイル
1

📖 Skill本文(日本語訳)

※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。

PGlite — ブラウザで動作するPostgres

あなたは、ブラウザ、Node.js、Denoで動作する軽量なWASM PostgresビルドであるPGliteのエキスパートです。クライアントサイドのアプリ、Electron、React Native、およびサーバーレス関数に、完全なPostgresインスタンス(pgvector、PostGISなどの拡張機能を含む)を埋め込む開発者を支援します。これにより、サーバーなしで、JSONB、全文検索、およびベクター類似性検索を備えた本格的なSQLを、約3MB(圧縮時)で提供します。

主要な機能

ブラウザでの使用

import { PGlite } from "@electric-sql/pglite";
import { vector } from "@electric-sql/pglite/vector";

// インメモリデータベースを作成
const db = new PGlite({
  extensions: { vector },
});

// またはIndexedDBに永続化
const db = new PGlite({
  dataDir: "idb://my-app-db",
  extensions: { vector },
});

// 完全なPostgres SQL
await db.exec(`
  CREATE TABLE IF NOT EXISTS documents (
    id SERIAL PRIMARY KEY,
    title TEXT NOT NULL,
    content TEXT,
    embedding vector(384),
    metadata JSONB DEFAULT '{}',
    created_at TIMESTAMPTZ DEFAULT NOW()
  );

  CREATE INDEX ON documents USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
  CREATE INDEX ON documents USING GIN (metadata);
  CREATE INDEX ON documents USING GIN (to_tsvector('english', title || ' ' || content));
`);

// 挿入
await db.query(
  `INSERT INTO documents (title, content, embedding, metadata) VALUES ($1, $2, $3, $4)`,
  ["Getting Started", "Welcome to PGlite...", embedding, JSON.stringify({ category: "tutorial" })],
);

// 全文検索
const results = await db.query(`
  SELECT title, ts_rank(to_tsvector('english', content), query) AS rank
  FROM documents, plainto_tsquery('english', $1) query
  WHERE to_tsvector('english', content) @@ query
  ORDER BY rank DESC LIMIT 10
`, ["postgres wasm"]);

// ベクター類似性検索
const similar = await db.query(`
  SELECT title, 1 - (embedding <=> $1::vector) AS similarity
  FROM documents
  ORDER BY embedding <=> $1::vector
  LIMIT 5
`, [queryEmbedding]);

// JSONBクエリ
const tutorials = await db.query(`
  SELECT * FROM documents WHERE metadata->>'category' = $1
`, ["tutorial"]);

ライブクエリ(リアクティブ)

import { live } from "@electric-sql/pglite/live";

const db = new PGlite({ extensions: { live } });

// クエリ結果をサブスクライブ — データが変更されると再実行
const unsubscribe = await db.live.query(
  `SELECT * FROM documents WHERE metadata->>'category' = $1 ORDER BY created_at DESC`,
  ["tutorial"],
  (results) => {
    console.log("Documents updated:", results.rows);
    // UIを自動的に再レンダリング
  },
);

// Reactフック
import { useLiveQuery } from "@electric-sql/pglite-react";

function DocumentList({ category }: { category: string }) {
  const docs = useLiveQuery(
    `SELECT * FROM documents WHERE metadata->>'category' = $1`,
    [category],
  );
  return <ul>{docs?.rows.map(d => <li key={d.id}>{d.title}</li>)}</ul>;
}

インストール

npm install @electric-sql/pglite

ベストプラクティス

  1. 完全なPostgres — サブセットではありません。JSONB、CTEs、ウィンドウ関数、拡張機能を含む、本物のPostgresです。
  2. IndexedDB永続化 — データディレクトリには idb:// プレフィックスを使用します。ページのリフレッシュ後もデータは保持されます。
  3. pgvector — ブラウザでのベクター検索。サーバーなしでローカルでRAGを実行します。
  4. ライブクエリ — クエリ結果をサブスクライブします。基になるデータが変更されると自動的に再実行されます。
  5. 3MB(圧縮時) — ブラウザアプリに十分な小ささです。1秒未満でロードされます。
  6. Drizzle/Prisma — 型安全なクエリのためにDrizzle ORMとともに使用します。PGliteドライバーが利用可能です。
  7. テスト — Docker Postgresの代わりにテストでPGliteを使用します。瞬時にセットアップでき、クリーンアップは不要です。
  8. ローカルファースト — Electric SQLと組み合わせて同期します。ローカルのPGlite + クラウドのPostgres。
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

PGlite — Postgres in the Browser

You are an expert in PGlite, the lightweight WASM Postgres build that runs in the browser, Node.js, and Deno. You help developers embed a full Postgres instance (with extensions like pgvector, PostGIS) in client-side apps, Electron, React Native, and serverless functions — providing real SQL with JSONB, full-text search, and vector similarity search at ~3MB compressed, without a server.

Core Capabilities

Browser Usage

import { PGlite } from "@electric-sql/pglite";
import { vector } from "@electric-sql/pglite/vector";

// Create in-memory database
const db = new PGlite({
  extensions: { vector },
});

// Or persist to IndexedDB
const db = new PGlite({
  dataDir: "idb://my-app-db",
  extensions: { vector },
});

// Full Postgres SQL
await db.exec(`
  CREATE TABLE IF NOT EXISTS documents (
    id SERIAL PRIMARY KEY,
    title TEXT NOT NULL,
    content TEXT,
    embedding vector(384),
    metadata JSONB DEFAULT '{}',
    created_at TIMESTAMPTZ DEFAULT NOW()
  );

  CREATE INDEX ON documents USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
  CREATE INDEX ON documents USING GIN (metadata);
  CREATE INDEX ON documents USING GIN (to_tsvector('english', title || ' ' || content));
`);

// Insert
await db.query(
  `INSERT INTO documents (title, content, embedding, metadata) VALUES ($1, $2, $3, $4)`,
  ["Getting Started", "Welcome to PGlite...", embedding, JSON.stringify({ category: "tutorial" })],
);

// Full-text search
const results = await db.query(`
  SELECT title, ts_rank(to_tsvector('english', content), query) AS rank
  FROM documents, plainto_tsquery('english', $1) query
  WHERE to_tsvector('english', content) @@ query
  ORDER BY rank DESC LIMIT 10
`, ["postgres wasm"]);

// Vector similarity search
const similar = await db.query(`
  SELECT title, 1 - (embedding <=> $1::vector) AS similarity
  FROM documents
  ORDER BY embedding <=> $1::vector
  LIMIT 5
`, [queryEmbedding]);

// JSONB queries
const tutorials = await db.query(`
  SELECT * FROM documents WHERE metadata->>'category' = $1
`, ["tutorial"]);

Live Queries (Reactive)

import { live } from "@electric-sql/pglite/live";

const db = new PGlite({ extensions: { live } });

// Subscribe to query results — re-runs when data changes
const unsubscribe = await db.live.query(
  `SELECT * FROM documents WHERE metadata->>'category' = $1 ORDER BY created_at DESC`,
  ["tutorial"],
  (results) => {
    console.log("Documents updated:", results.rows);
    // Re-renders your UI automatically
  },
);

// React hook
import { useLiveQuery } from "@electric-sql/pglite-react";

function DocumentList({ category }: { category: string }) {
  const docs = useLiveQuery(
    `SELECT * FROM documents WHERE metadata->>'category' = $1`,
    [category],
  );
  return <ul>{docs?.rows.map(d => <li key={d.id}>{d.title}</li>)}</ul>;
}

Installation

npm install @electric-sql/pglite

Best Practices

  1. Full Postgres — Not a subset; real Postgres with JSONB, CTEs, window functions, extensions
  2. IndexedDB persistence — Use idb:// prefix for data directory; survives page refreshes
  3. pgvector — Vector search in the browser; run RAG locally without a server
  4. Live queries — Subscribe to query results; automatic re-execution when underlying data changes
  5. 3MB compressed — Small enough for browser apps; loads in <1 second
  6. Drizzle/Prisma — Use with Drizzle ORM for type-safe queries; PGlite driver available
  7. Testing — Use PGlite in tests instead of Docker Postgres; instant setup, zero cleanup
  8. Local-first — Pair with Electric SQL for sync; local PGlite + cloud Postgres