Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Short Introduction for Kysely
Search
YUMOTO Michitaka
November 20, 2024
Technology
1
330
Short Introduction for Kysely
Remix Tokyo × Cloudflare Meetup Lighting Talks
https://lu.ma/wv9xzam7
YUMOTO Michitaka
November 20, 2024
Tweet
Share
More Decks by YUMOTO Michitaka
See All by YUMOTO Michitaka
Dive Into Single Fetch
gothedistance
1
220
クラフトマンシップ(職人魂)を湾岸MIDNIGHTから学ぼう / Learn Craftsmanship from Wangan Midnight
gothedistance
0
290
プロ野球をデータモデリングしてみたら沼だった件 / Baseball ERD Modeling to be obsessed
gothedistance
2
820
フロントエンド開発スタイルの変遷と、私がFlutterにハマったわけ
gothedistance
8
13k
ITプロジェクトのはじめ方 / How to work around software project
gothedistance
27
150k
私がITプランナーを志すようになった理由、そして、目指していること / bpstudy142_why_i_wanna_be_a_it_plannner
gothedistance
1
910
ITプランナーの必要性を小一時間問い詰めたい / Why We need IT-Planner.
gothedistance
0
14k
IT企画をちゃんとやりたい#01 ガイダンス資料 / IT Planning do well_01
gothedistance
0
6.5k
bpstudy_127
gothedistance
0
560
Other Decks in Technology
See All in Technology
AI との良い付き合い方を僕らは誰も知らない (WSS 2026 静岡版)
asei
1
260
投資戦略を量産せよ 2 - マケデコセミナー(2025/12/26)
gamella
1
630
善意の活動は、なぜ続かなくなるのか ーふりかえりが"構造を変える判断"になった半年間ー
matsukurou
0
360
コールドスタンバイ構成でCDは可能か
hiramax
0
130
Bill One 開発エンジニア 紹介資料
sansan33
PRO
4
17k
チームで安全にClaude Codeを利用するためのプラクティス / team-claude-code-practices
tomoki10
6
3k
All About Sansan – for New Global Engineers
sansan33
PRO
1
1.3k
AI駆動開発ライフサイクル(AI-DLC)の始め方
ryansbcho79
0
310
AI時代のアジャイルチームを目指して ー スクラムというコンフォートゾーンからの脱却 ー / Toward Agile Teams in the Age of AI
takaking22
11
5.6k
Sansan Engineering Unit 紹介資料
sansan33
PRO
1
3.6k
20251225_たのしい出張報告&IgniteRecap!
ponponmikankan
0
110
202512_AIoT.pdf
iotcomjpadmin
0
190
Featured
See All Featured
The Illustrated Children's Guide to Kubernetes
chrisshort
51
51k
The Invisible Side of Design
smashingmag
302
51k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
120
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
1
340
Stop Working from a Prison Cell
hatefulcrawdad
273
21k
The Power of CSS Pseudo Elements
geoffreycrofte
80
6.1k
Embracing the Ebb and Flow
colly
88
4.9k
GraphQLとの向き合い方2022年版
quramy
50
14k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.2k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.7k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
0
1.8k
Testing 201, or: Great Expectations
jmmastey
46
7.8k
Transcript
Kysely ポータブルなTypeScript のクエリビルダ Remix Meetup #2 2024.09.17 @gothedistance Quality Start,inc
Agenda TypeScript とORM Kysely とは Kysely のPros/Cons Quality Start,inc 2
自己紹介 YUMOTO Michitaka 1979 年生まれ、松坂世代 https://x.com/gothedistance Flutter/Remix/Python を主に使っています。 野球が好きで、東京ヤクルトスワローズのファン Quality
Start,inc 3
ORM に疲れた時期が個人的にあった Remix に出会うまではPython を使うことが多く、SQLAlchemy を使った。 SQLAlchemy は重厚長大なORM で、モデル定義もガッツリ、DB とのやり取
りも独自のモデル設計。情報量がとにかく多い。 Remix を書き始めて、自分は 「コンパイルできるSQL 」 が欲しかっただけ なのでは・・・と天啓があった。 ORM のコードの書き方への習熟があっても最後は発行しているSQL のレビ ューになるし、ORM ではなくクエリビルダを使ってみようかな! というわけで、Kysely を使ってみた。 kysely-d1 を使えばCloudFlare D1 が 使える! Quality Start,inc 4
Kysely こんな感じでSQL を組み立ててくれるライブラリ。 selectFrom, innerJoin, where, select などを発行する時に、型推論が効いて いるので自動的にカラムやテーブル名の補完が走ります。 const
result = await db .selectFrom('person') .innerJoin('pet', 'pet.owner_id', 'person.id') .select(['person.id', 'pet.name as pet_name']) .execute() Quality Start,inc 5
Kysely のスキーマ定義(TypeScript の型定義) Prisma のような独自DSL ではなく、TS の型定義でDB スキーマを表現。 ORM で必ずあるリレーション定義がありません!
クエリビルダなんで! 文字数のようなカラムの付帯情報もありません! クエリビルダな(ry export type Pet = { id: Generated<number>; owner_id: Generated<int>; name: Generated<string>; created: Timestamp | null; modified: Timestamp | null; }; Quality Start,inc 6
Kysely の嬉しみ SQL の表現力を最大限にかせる!これが一番! Prisma のようなORM は、リレーション/ スキーマ定義をテコにデータの CRUD を単純化するために、SQL
の表現力を殺している。 Prisma はDB 関数,CTE,EXISTS,CASE, サブクエリなどが使えず、 queryRaw や TypedSQL で対応できるが、SQL の表現力を活かす方法に振り切ってる Kysely には勝てない。 Prisma の場合は1つの関数実行でN 個のクエリが吐かれる事が多く、個人 的に違和感がある。 ORM の設定や仕様に追従/ 習熟して得られるメリットが薄いなら、クエリ ビルダもアリよりのアリです。 Quality Start,inc 7
Kysely に求めてはあかんもの ネストされたデータの戻り値。 order:{detail: [ {item:}]} みたいな。 Kysely は一次元配列しか返しません。 SQL
の発行によってネストしたオブ ジェクトは得られないと同じ。JOIN 先のカラム名が同じ場合は上書きされ る。カラムの選択が必須になると思っていい。 マイグレーションは正直Prisma のほうが楽。モデル定義を持っているから ね。 スキーマのモデルに拡張メソッドを生やすとか、クエリ発行前にHook する イベント仕込むとか、そういうのも持ってないです。ActiveRecord 風なコ ードを書くのは難しい。 ORM との距離のとり方について誰か僕と話そう!! Quality Start,inc 8