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
200
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
190
クラフトマンシップ(職人魂)を湾岸MIDNIGHTから学ぼう / Learn Craftsmanship from Wangan Midnight
gothedistance
0
260
プロ野球をデータモデリングしてみたら沼だった件 / Baseball ERD Modeling to be obsessed
gothedistance
2
770
フロントエンド開発スタイルの変遷と、私がFlutterにハマったわけ
gothedistance
8
12k
ITプロジェクトのはじめ方 / How to work around software project
gothedistance
27
150k
私がITプランナーを志すようになった理由、そして、目指していること / bpstudy142_why_i_wanna_be_a_it_plannner
gothedistance
1
870
ITプランナーの必要性を小一時間問い詰めたい / Why We need IT-Planner.
gothedistance
0
14k
IT企画をちゃんとやりたい#01 ガイダンス資料 / IT Planning do well_01
gothedistance
0
6.5k
bpstudy_127
gothedistance
0
530
Other Decks in Technology
See All in Technology
LLM時代の検索とコンテキストエンジニアリング
shibuiwilliam
2
1.1k
キャリアを支え組織力を高める「多層型ふりかえり」 / 20250821 Kazuki Mori
shift_evolve
PRO
2
300
Gaze-LLE: Gaze Target Estimation via Large-Scale Learned Encoders
kzykmyzw
0
320
JuniorからSeniorまで: DevOpsエンジニアの成長ロードマップ
yuriemori
0
160
kintone開発チームの紹介
cybozuinsideout
PRO
0
73k
[CVPR2025論文読み会] Linguistics-aware Masked Image Modelingfor Self-supervised Scene Text Recognition
s_aiueo32
0
210
実践データベース設計 ①データベース設計概論
recruitengineers
PRO
2
230
アジャイルテストで高品質のスプリントレビューを
takesection
0
110
ABEMAにおける 生成AI活用の現在地 / The Current Status of Generative AI at ABEMA
dekatotoro
0
660
Android Studio の 新しいAI機能を試してみよう / Try out the new AI features in Android Studio
yanzm
0
270
MySQL HeatWave:サービス概要のご紹介
oracle4engineer
PRO
4
1.7k
GitHub Copilot coding agent を推したい / AIDD Nagoya #1
tnir
2
4.6k
Featured
See All Featured
Building a Modern Day E-commerce SEO Strategy
aleyda
43
7.5k
Rails Girls Zürich Keynote
gr2m
95
14k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
Why Our Code Smells
bkeepers
PRO
338
57k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Gamification - CAS2011
davidbonilla
81
5.4k
Documentation Writing (for coders)
carmenintech
73
5k
Testing 201, or: Great Expectations
jmmastey
45
7.6k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.4k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
23
1.4k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
31
2.2k
Mobile First: as difficult as doing things right
swwweet
223
9.9k
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