libsql
libSQLは、SQLiteをベースに、データ同期やHTTP APIなどの機能を追加したデータベースで、Tursoクラウドデータベースやエッジ環境での利用に適しており、SDKを使った接続やデータ操作を支援するSkill。
📜 元の英語説明(参考)
libSQL — a fork of SQLite with replication, HTTP API, and embedded replicas (used by Turso). Use when you need embedded SQLite with remote sync, an edge-compatible database, or a Turso cloud database. Covers the @libsql/client SDK, local/in-memory/cloud connections, embedded replicas, batch queries, and transactions.
🇯🇵 日本人クリエイター向け解説
libSQLは、SQLiteをベースに、データ同期やHTTP APIなどの機能を追加したデータベースで、Tursoクラウドデータベースやエッジ環境での利用に適しており、SDKを使った接続やデータ操作を支援するSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o libsql.zip https://jpskill.com/download/15068.zip && unzip -o libsql.zip && rm libsql.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/15068.zip -OutFile "$d\libsql.zip"; Expand-Archive "$d\libsql.zip" -DestinationPath $d -Force; ri "$d\libsql.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
libsql.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
libsqlフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
libSQL
概要
libSQL は SQLite のフォークであり、レプリケーション、HTTP API アクセス、および埋め込みレプリカを追加します。これは Turso の背後にあるデータベースエンジンです。@libsql/client SDK を使用して、ローカルの SQLite ファイル、インメモリデータベース、または Turso クラウドデータベースに同じ API で接続します。
インストール
npm install @libsql/client
# or
bun add @libsql/client
接続モード
ローカル SQLite ファイル
import { createClient } from "@libsql/client";
const db = createClient({
url: "file:local.db",
});
インメモリ (テスト)
const db = createClient({
url: ":memory:",
});
Turso クラウド
const db = createClient({
url: process.env.TURSO_DATABASE_URL!, // libsql://your-db.turso.io
authToken: process.env.TURSO_AUTH_TOKEN!, // Turso CLI から生成
});
埋め込みレプリカ
リモートの Turso データベースから同期するローカル SQLite ファイル。読み取りはローカルファイルにアクセスし(高速)、書き込みはリモートに送信され、同期して戻ります。
const db = createClient({
url: "file:local-replica.db", // ローカルレプリカパス
syncUrl: process.env.TURSO_DATABASE_URL!, // リモート Turso URL
authToken: process.env.TURSO_AUTH_TOKEN!,
syncInterval: 60, // 60秒ごとに自動同期
});
// 手動同期
await db.sync();
HTTP モード (Edge)
ネイティブ SQLite バインディングが利用できないエッジ環境向け:
const db = createClient({
url: process.env.TURSO_DATABASE_URL!, // HTTP モードでは https:// URL を使用
authToken: process.env.TURSO_AUTH_TOKEN!,
});
// @libsql/client は、リモート URL が指定された場合、自動的に HTTP を使用します
基本的なクエリ
import { createClient } from "@libsql/client";
const db = createClient({ url: "file:app.db" });
// DDL の実行
await db.execute(`
CREATE TABLE IF NOT EXISTS posts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
body TEXT,
slug TEXT UNIQUE NOT NULL,
created_at INTEGER DEFAULT (unixepoch())
)
`);
// 挿入
await db.execute({
sql: "INSERT INTO posts (title, body, slug) VALUES (?, ?, ?)",
args: ["Hello World", "First post content", "hello-world"],
});
// すべて選択
const result = await db.execute("SELECT * FROM posts ORDER BY created_at DESC");
console.log(result.rows); // Row[]
console.log(result.columns); // string[]
// パラメータ付きで選択
const post = await db.execute({
sql: "SELECT * FROM posts WHERE slug = ?",
args: ["hello-world"],
});
console.log(post.rows[0]); // 最初の行
// 更新
await db.execute({
sql: "UPDATE posts SET title = ? WHERE id = ?",
args: ["Updated Title", 1],
});
// 削除
await db.execute({
sql: "DELETE FROM posts WHERE id = ?",
args: [1],
});
バッチクエリ
単一のラウンドトリップで複数のステートメントを実行します。
// バッチ内のすべてのステートメントはアトミックに実行されます (トランザクションのように)
const results = await db.batch([
{
sql: "INSERT INTO posts (title, slug) VALUES (?, ?)",
args: ["Post 1", "post-1"],
},
{
sql: "INSERT INTO posts (title, slug) VALUES (?, ?)",
args: ["Post 2", "post-2"],
},
"SELECT COUNT(*) as total FROM posts",
]);
console.log(results[2].rows[0]); // { total: 2 }
トランザクション
import { createClient } from "@libsql/client";
const db = createClient({ url: "file:app.db" });
// インタラクティブトランザクション
const tx = await db.transaction("write");
try {
await tx.execute({
sql: "INSERT INTO accounts (user_id, balance) VALUES (?, ?)",
args: [1, 1000],
});
await tx.execute({
sql: "INSERT INTO accounts (user_id, balance) VALUES (?, ?)",
args: [2, 500],
});
// 振替
await tx.execute({
sql: "UPDATE accounts SET balance = balance - ? WHERE user_id = ?",
args: [100, 1],
});
await tx.execute({
sql: "UPDATE accounts SET balance = balance + ? WHERE user_id = ?",
args: [100, 2],
});
await tx.commit();
console.log("Transfer complete");
} catch (err) {
await tx.rollback();
console.error("Transfer failed:", err);
}
トランザクションモード:
"write"— 読み書きトランザクション"read"— 読み取り専用トランザクション (レプリカで高速)"deferred"— SQLite 遅延トランザクション
結果行へのアクセス
const result = await db.execute("SELECT id, title, created_at FROM posts");
// カラム名でアクセス
for (const row of result.rows) {
console.log(row.id, row.title, row.created_at);
}
// カラムメタデータ
console.log(result.columns); // ["id", "title", "created_at"]
// 最後の挿入 ID
const insert = await db.execute({
sql: "INSERT INTO posts (title, slug) VALUES (?, ?)",
args: ["New Post", "new-post"],
});
console.log(insert.lastInsertRowid); // bigint
console.log(insert.rowsAffected); // number
Turso のセットアップ
# Turso CLI のインストール
curl -sSfL https://get.tur.so/install.sh | bash
# ログイン
turso auth login
# データベースの作成
turso db create my-app-db
# 接続 URL の取得
turso db show my-app-db --url
# → libsql://my-app-db-yourname.turso.io
# 認証トークンの作成
turso db tokens create my-app-db
# → eyJhbGciOi...
# データベースの一覧表示
turso db list
# シェルの起動
turso db shell my-app-db
環境設定
# .env
TURSO_DATABASE_URL=libsql://my-app-db-yourname.turso.io
TURSO_AUTH_TOKEN=eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9...
// src/db.ts — シングルトンクライアント
import { createClient } from "@libsql/client";
if (!process.env.TURSO_DATABASE_URL) {
throw new Error("TURSO_DATABASE_URL is required");
}
export const db = createClient({
url: process.env.TURSO_DATABASE_URL,
authToken: process.env.TURSO_AUTH_TOKEN,
});
完全な例: ブログ API
import { createClient } from "@libsql/client";
const db = createClient({
url: process.env.TURSO_DATABASE_URL!,
authToken: process.env.TURSO_AUTH_TOKEN!,
});
// スキーマの初期化
await db.execute(`
CREATE TABLE IF NOT EXISTS posts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
s
(原文がここで切り詰められています) 📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
libSQL
Overview
libSQL is a fork of SQLite that adds replication, HTTP API access, and embedded replicas. It is the database engine behind Turso. Use the @libsql/client SDK to connect to local SQLite files, in-memory databases, or Turso cloud databases with the same API.
Installation
npm install @libsql/client
# or
bun add @libsql/client
Connection Modes
Local SQLite File
import { createClient } from "@libsql/client";
const db = createClient({
url: "file:local.db",
});
In-Memory (testing)
const db = createClient({
url: ":memory:",
});
Turso Cloud
const db = createClient({
url: process.env.TURSO_DATABASE_URL!, // libsql://your-db.turso.io
authToken: process.env.TURSO_AUTH_TOKEN!, // Generated from Turso CLI
});
Embedded Replica
Local SQLite file that syncs from a remote Turso database. Reads hit the local file (fast), writes go to the remote and sync back:
const db = createClient({
url: "file:local-replica.db", // Local replica path
syncUrl: process.env.TURSO_DATABASE_URL!, // Remote Turso URL
authToken: process.env.TURSO_AUTH_TOKEN!,
syncInterval: 60, // Auto-sync every 60 seconds
});
// Manual sync
await db.sync();
HTTP Mode (Edge)
For edge environments where native SQLite bindings are not available:
const db = createClient({
url: process.env.TURSO_DATABASE_URL!, // Use https:// URL for HTTP mode
authToken: process.env.TURSO_AUTH_TOKEN!,
});
// @libsql/client automatically uses HTTP when a remote URL is provided
Basic Queries
import { createClient } from "@libsql/client";
const db = createClient({ url: "file:app.db" });
// Execute DDL
await db.execute(`
CREATE TABLE IF NOT EXISTS posts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
body TEXT,
slug TEXT UNIQUE NOT NULL,
created_at INTEGER DEFAULT (unixepoch())
)
`);
// Insert
await db.execute({
sql: "INSERT INTO posts (title, body, slug) VALUES (?, ?, ?)",
args: ["Hello World", "First post content", "hello-world"],
});
// Select all
const result = await db.execute("SELECT * FROM posts ORDER BY created_at DESC");
console.log(result.rows); // Row[]
console.log(result.columns); // string[]
// Select with parameters
const post = await db.execute({
sql: "SELECT * FROM posts WHERE slug = ?",
args: ["hello-world"],
});
console.log(post.rows[0]); // First row
// Update
await db.execute({
sql: "UPDATE posts SET title = ? WHERE id = ?",
args: ["Updated Title", 1],
});
// Delete
await db.execute({
sql: "DELETE FROM posts WHERE id = ?",
args: [1],
});
Batch Queries
Execute multiple statements in a single round trip:
// All statements in a batch run atomically (like a transaction)
const results = await db.batch([
{
sql: "INSERT INTO posts (title, slug) VALUES (?, ?)",
args: ["Post 1", "post-1"],
},
{
sql: "INSERT INTO posts (title, slug) VALUES (?, ?)",
args: ["Post 2", "post-2"],
},
"SELECT COUNT(*) as total FROM posts",
]);
console.log(results[2].rows[0]); // { total: 2 }
Transactions
import { createClient } from "@libsql/client";
const db = createClient({ url: "file:app.db" });
// Interactive transaction
const tx = await db.transaction("write");
try {
await tx.execute({
sql: "INSERT INTO accounts (user_id, balance) VALUES (?, ?)",
args: [1, 1000],
});
await tx.execute({
sql: "INSERT INTO accounts (user_id, balance) VALUES (?, ?)",
args: [2, 500],
});
// Transfer
await tx.execute({
sql: "UPDATE accounts SET balance = balance - ? WHERE user_id = ?",
args: [100, 1],
});
await tx.execute({
sql: "UPDATE accounts SET balance = balance + ? WHERE user_id = ?",
args: [100, 2],
});
await tx.commit();
console.log("Transfer complete");
} catch (err) {
await tx.rollback();
console.error("Transfer failed:", err);
}
Transaction modes:
"write"— read-write transaction"read"— read-only transaction (faster on replicas)"deferred"— SQLite deferred transaction
Result Row Access
const result = await db.execute("SELECT id, title, created_at FROM posts");
// Access by column name
for (const row of result.rows) {
console.log(row.id, row.title, row.created_at);
}
// Column metadata
console.log(result.columns); // ["id", "title", "created_at"]
// Last insert ID
const insert = await db.execute({
sql: "INSERT INTO posts (title, slug) VALUES (?, ?)",
args: ["New Post", "new-post"],
});
console.log(insert.lastInsertRowid); // bigint
console.log(insert.rowsAffected); // number
Setting Up Turso
# Install Turso CLI
curl -sSfL https://get.tur.so/install.sh | bash
# Login
turso auth login
# Create database
turso db create my-app-db
# Get connection URL
turso db show my-app-db --url
# → libsql://my-app-db-yourname.turso.io
# Create auth token
turso db tokens create my-app-db
# → eyJhbGciOi...
# List databases
turso db list
# Open shell
turso db shell my-app-db
Environment Setup
# .env
TURSO_DATABASE_URL=libsql://my-app-db-yourname.turso.io
TURSO_AUTH_TOKEN=eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9...
// src/db.ts — singleton client
import { createClient } from "@libsql/client";
if (!process.env.TURSO_DATABASE_URL) {
throw new Error("TURSO_DATABASE_URL is required");
}
export const db = createClient({
url: process.env.TURSO_DATABASE_URL,
authToken: process.env.TURSO_AUTH_TOKEN,
});
Full Example: Blog API
import { createClient } from "@libsql/client";
const db = createClient({
url: process.env.TURSO_DATABASE_URL!,
authToken: process.env.TURSO_AUTH_TOKEN!,
});
// Initialize schema
await db.execute(`
CREATE TABLE IF NOT EXISTS posts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
slug TEXT UNIQUE NOT NULL,
body TEXT NOT NULL DEFAULT '',
published INTEGER NOT NULL DEFAULT 0,
created_at INTEGER NOT NULL DEFAULT (unixepoch())
)
`);
// Create
async function createPost(title: string, slug: string, body: string) {
const result = await db.execute({
sql: "INSERT INTO posts (title, slug, body) VALUES (?, ?, ?) RETURNING *",
args: [title, slug, body],
});
return result.rows[0];
}
// Read
async function getPosts(publishedOnly = true) {
const sql = publishedOnly
? "SELECT * FROM posts WHERE published = 1 ORDER BY created_at DESC"
: "SELECT * FROM posts ORDER BY created_at DESC";
const result = await db.execute(sql);
return result.rows;
}
// Update
async function publishPost(id: number) {
await db.execute({
sql: "UPDATE posts SET published = 1 WHERE id = ?",
args: [id],
});
}
// Delete
async function deletePost(id: number) {
await db.execute({
sql: "DELETE FROM posts WHERE id = ?",
args: [id],
});
}
Guidelines
- Always use parameterized queries with
args— never string-concatenate SQL. - Use
batch()for multiple related inserts/updates to reduce round trips. - Prefer
transaction("write")for operations that must be atomic. - Use embedded replicas when you need fast reads and can tolerate eventual consistency.
- Call
db.sync()manually after writes when using embedded replicas for immediate read consistency. - Use
":memory:"for tests — fast and isolated. - Store
TURSO_DATABASE_URLandTURSO_AUTH_TOKENin environment variables, never in code. lastInsertRowidis abigint— convert withNumber()when needed.