MENU

Kyselyとは|型安全に特化したTSクエリビルダ

Kysely アイキャッチ
Kysely

Kysely(カイセリー)は、TypeScript向けに開発された型安全なSQLクエリビルダで、2022年頃から本格的に普及し始めました。Prisma、Drizzle、TypeORMといった「ORM」ではなく、あえて「クエリビルダ」と位置づけられており、エンティティクラスやマイグレーションの統合機能を抱え込まず、SQLの組み立てそのものに特化しているのが特徴です。テーブル定義をTypeScriptの型として宣言するだけで、SELECTやJOIN、WHERE、ORDER BYなどあらゆる句で完全な型推論が効くため、複雑なクエリも安心して書けます。Node.js、Bun、Deno、エッジ環境すべてに対応しています。

目次

この記事の目次

  1. Kyselyを特徴づける3つの設計思想
  2. Kyselyとフル機能ORMとの比較
  3. Kysely導入時のチェックリスト
  4. Kyselyによるクエリ実装の典型例
  5. まとめ

Kyselyを特徴づける3つの設計思想

Kyselyを特徴づける3つの設計思想

Kyselyの設計思想を一言で表すなら「クエリビルダにできることに集中する」という潔さです。エンティティクラス、デコレーター、独自スキーマ言語、自動マイグレーションといったORMが抱える要素を意図的に持たず、あくまでSQLの組み立てを型安全に支援するライブラリとして設計されています。これにより、機能が小さくても深く磨かれ、複雑なクエリでも型推論が破綻しにくいという強みが生まれています。

型推論の徹底ぶりはKyselyの最大の魅力です。Databaseという型エイリアスとしてテーブルとカラムの構造を宣言すると、db.selectFrom('user').select(['id', 'name']).where('age', '>', 30)というチェーンの各ステップで、利用可能なテーブル名、カラム名、演算子、リテラル型がすべて補完されます。存在しないカラムやJOIN前のテーブルを誤って参照すれば即コンパイルエラーとなるため、開発時の安心感が非常に高いです。さらにランタイム依存が極めて少なく、エッジ環境でも軽快に動作する点も評価されています。

Kyselyとフル機能ORMとの比較

Kyselyとフル機能ORMとの比較

Kyselyとフル機能のORM(Prisma、TypeORM、MikroORM等)を比較する際の最大の論点は、抽象化の粒度です。フル機能ORMはエンティティクラスやリレーション、マイグレーション、シーディング、トランザクションスコープなどを統一的に抱え込み、データアクセス層全体を一気通貫で支援します。学習コストはやや高いものの、整った仕組みに乗ればCRUDが極めて高速に書けます。

対照的にKyselyは「SQLをTypeScriptで安全に書く」という単機能に集中しています。スキーマ管理にはkysely-migrationsやAtlas、Alembic相当の外部ツールを併用し、エンティティ層が必要ならRepositoryパターンを自分で設計するスタイルです。この「組み合わせる前提」の設計は、過剰な抽象化を嫌う開発者やSQLに精通したチームから高く評価されており、PrismaやDrizzleで足りない複雑なクエリ部分だけKyselyで補うようなハイブリッド構成も増えています。フレームワークではなく、信頼できる部品としてのポジションです。

Kysely導入時のチェックリスト

Kysely導入時のチェックリスト

Kyselyを導入するうえでまず重要なのが、Database型の正確な定義です。例えばinterface Database { user: UserTable; post: PostTable }のように、テーブル名をキー、各テーブルの型をバリューとしてマップ型として宣言します。各テーブル型では、ColumnTypeのようにinsert、update、readで型が異なるカラムを表現できるため、自動採番やデフォルト値の扱いも厳密に表現可能です。

Dialect(実行エンジン)は対象データベースに応じて選択します。PostgresDialect、MysqlDialect、SqliteDialectといった公式提供のものに加え、Neon、PlanetScale、D1向けのコミュニティ製Dialectも存在します。スキーマ生成を半自動化したい場合は、既存DBから型を生成するkysely-codegenを併用すると便利です。マイグレーションはKysely本体ではなくkysely-migrate、Atlas、Liquibaseなど別ツールで管理する設計思想であるため、ツール選定も含めて運用全体を設計する必要があります。tsconfig.jsonはstrictオプション有効が事実上の前提です。

Kyselyによるクエリ実装の典型例

Kyselyによるクエリ実装の典型例

Kyselyを使ったコードはまずDatabase型の定義から始まります。プロジェクトの全テーブルとカラムをTypeScriptの型として正確に表現し、ColumnTypeで読み書きの違いも明示します。次にconst db = new Kysely({ dialect: new PostgresDialect({...}) })のようにインスタンスを生成し、必要な接続プールやログハンドラを設定します。

クエリはdb.selectFrom('user').innerJoin('post', 'post.user_id', 'user.id').select(['user.id', 'post.title']).where('user.active', '=', true).orderBy('post.created_at desc').execute()のようなチェーンで組み立てます。JOIN後はカラム名にテーブル接頭辞が要求されるなど、SQLの整合性を型レベルで強制してくれるため、複雑なクエリほどKyselyの恩恵が大きくなります。挿入はinsertInto、更新はupdateTable、削除はdeleteFromと、SQL文に対応した直感的なAPIで構成されており、KnexやSequelizeのraw queryよりはるかに安全に保守できます。NextやHonoなど任意のフレームワークと自由に組み合わせ可能です。

まとめ

Kyselyは、エンティティ機能を意図的に削ぎ落とし、SQLクエリビルダとしての型安全性を極限まで磨き上げた現代的なライブラリです。フル機能ORMでは表現しづらい複雑なJOINや集計、ウィンドウ関数を安全に組み立てたい場面で特に光ります。マイグレーションやリポジトリ層を自分で組み合わせる必要はありますが、それを許容できるチームにとっては、長期保守に耐える極めて信頼性の高いデータアクセス基盤となるでしょう。

※本記事はIT用語辞典の手書きドラフトです。公開前に最新情報・出典を確認のうえ加筆修正してください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次