kysely
Write type-safe SQL with Kysely query builder. Use when a user asks to write raw SQL with TypeScript safety, build queries without an ORM, use a lightweight SQL builder, or migrate from Knex with type safety.
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o kysely.zip https://jpskill.com/download/15048.zip && unzip -o kysely.zip && rm kysely.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/15048.zip -OutFile "$d\kysely.zip"; Expand-Archive "$d\kysely.zip" -DestinationPath $d -Force; ri "$d\kysely.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
kysely.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
kyselyフォルダができる - 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
📖 Claude が読む原文 SKILL.md(中身を展開)
この本文は AI(Claude)が読むための原文(英語または中国語)です。日本語訳は順次追加中。
Kysely
Overview
Kysely is a type-safe TypeScript SQL query builder. Unlike ORMs, it doesn't abstract away SQL — it gives you full SQL power with TypeScript autocompletion and type checking. Every query is validated at compile time. Zero overhead: Kysely generates SQL strings, nothing more.
Instructions
Step 1: Define Types
// db/types.ts — Database type definitions
import { Generated, Insertable, Selectable, Updateable } from 'kysely'
interface Database {
users: UsersTable
posts: PostsTable
comments: CommentsTable
}
interface UsersTable {
id: Generated<number>
name: string
email: string
created_at: Generated<Date>
}
interface PostsTable {
id: Generated<number>
title: string
body: string
author_id: number
published: boolean
created_at: Generated<Date>
}
// Helper types for insert/update (Generated fields are optional)
type NewUser = Insertable<UsersTable>
type UserUpdate = Updateable<UsersTable>
type User = Selectable<UsersTable>
Step 2: Queries
// db/queries.ts — Type-safe SQL queries
import { Kysely, PostgresDialect, sql } from 'kysely'
import { Pool } from 'pg'
const db = new Kysely<Database>({
dialect: new PostgresDialect({ pool: new Pool({ connectionString: process.env.DATABASE_URL }) }),
})
// Select with joins — fully typed result
const postsWithAuthor = await db
.selectFrom('posts')
.innerJoin('users', 'users.id', 'posts.author_id')
.select(['posts.id', 'posts.title', 'users.name as author_name'])
.where('posts.published', '=', true)
.orderBy('posts.created_at', 'desc')
.limit(20)
.execute()
// postsWithAuthor is { id: number, title: string, author_name: string }[]
// Subquery
const activeAuthors = await db
.selectFrom('users')
.select(['users.name', 'users.email'])
.where('users.id', 'in',
db.selectFrom('posts')
.select('posts.author_id')
.where('posts.published', '=', true)
.groupBy('posts.author_id')
)
.execute()
// Insert
const newUser = await db
.insertInto('users')
.values({ name: 'Alice', email: 'alice@example.com' })
.returningAll()
.executeTakeFirstOrThrow()
// Transaction
await db.transaction().execute(async (trx) => {
const user = await trx.insertInto('users')
.values({ name: 'Bob', email: 'bob@example.com' })
.returningAll()
.executeTakeFirstOrThrow()
await trx.insertInto('posts')
.values({ title: 'First Post', body: 'Hello!', author_id: user.id, published: true })
.execute()
})
Step 3: Migrations
// migrations/001_create_users.ts — Kysely migration
import { Kysely, sql } from 'kysely'
export async function up(db: Kysely<any>) {
await db.schema
.createTable('users')
.addColumn('id', 'serial', (col) => col.primaryKey())
.addColumn('name', 'varchar(255)', (col) => col.notNull())
.addColumn('email', 'varchar(255)', (col) => col.notNull().unique())
.addColumn('created_at', 'timestamp', (col) => col.defaultTo(sql`now()`).notNull())
.execute()
}
export async function down(db: Kysely<any>) {
await db.schema.dropTable('users').execute()
}
Guidelines
- Kysely is a query builder, not an ORM — no relations, no lazy loading, no magic. Just SQL with types.
- Use Kysely when you want SQL control with type safety. Use Drizzle or Prisma when you want ORM features.
- Kysely works with serverless databases (Neon, PlanetScale) via custom dialects.
- The
Insertable/Updateabletypes automatically makeGeneratedfields optional.