Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
SQLだけでマイグレーションしたい!
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
MakKi
December 19, 2025
Technology
1.4k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
SQLだけでマイグレーションしたい!
MyNA望年LT大会2025
MakKi
December 19, 2025
More Decks by MakKi
See All by MakKi
zero-micro: Codex Microがzero-kb02にそっくりだったので作ったった
makki_d
0
100
テストだけじゃない!インプロセスDBで生まれるGoらしさ
makki_d
0
80
テストだけじゃない!インプロセスDBで生まれるGoらしさ
makki_d
0
84
Recap: An Operating System in Go
makki_d
2
210
XSLTで作るBrainfuck処理系
makki_d
0
460
眼鏡と視力についての誤解を解く
makki_d
0
260
標準ライブラリの動向とイテレータのパフォーマンス
makki_d
3
800
range over funcのエラー処理
makki_d
1
1.9k
GoとテストとインプロセスDB
makki_d
3
730
Other Decks in Technology
See All in Technology
How to Design Configuration for Rails Applications
willnet
1
1.1k
JAWS-UGグッズ職人仕事の流儀
kentapapa
0
130
ガチで放置できるClaude Code実行環境の作り方.pdf
lamaglama39
0
1.9k
小規模OSSモデルは サイバーセキュリティ業務に どこまで使えるか
bbrbbq
0
170
Turning Repos into the Product Second Brain with an LLM Wiki
linedevth
0
130
トークン化預金DCJPYの取り組みと活用ユースケース
finengine
0
220
What Is JetBrains Air
x5gtrn
PRO
0
140
20年間 SNS サービス「GREE」 を支えた技術の刷新と、長期運用サービスの Kubernetes へのリアーキテクト
gree_tech
PRO
0
110
Rustuna: Rustによる高速なOptuna実装
pfn
PRO
0
210
LambdaWebFunctionsを試してみた / exploring-lambda-web-functions
koukihosaka
1
380
生成AI時代、PMは事業責任者に進化するともっと面白い〜PMだからこそ事業構造を動かせる時代に〜
kakehashi
PRO
0
210
CTO Night|NotionのAIエージェントとFDE
kzkhykw1991
0
300
Featured
See All Featured
How to train your dragon (web standard)
notwaldorf
96
6.9k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
Building an army of robots
kneath
307
47k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
310
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
540
Typedesign – Prime Four
hannesfritz
42
3.2k
Navigating Team Friction
lara
192
16k
Fireside Chat
paigeccino
43
4.1k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
590
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
1
640
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
570
Transcript
SQLだけで マイグレーションしたい! MyNA望年LT大会2025
はじめまして • 牧内大輔(MakKi) ◦ @makki_d ◦ makiuchi-d • KLab株式会社 ◦
スマホゲーム、主にサーバサイドや同期通信まわり ◦ DBはだいたいAurora MySQL • OSS ◦ gozxing: バーコードQRコードリーダーライター ◦ arelo: 自動リロードユーティリティ ◦ EMLauncher: スマホでバッグアプリ配信 ◦ WSNet2: スマホゲーム同期通信ライブラリ
https:/ /github.com/makiuchi-d/migy
• スキーマの変更を管理・適用する仕組み ◦ 状態を進めたり(Up)戻したり(Down) • いろいろなツールがある ◦ 独立したツールだったり ORMやフレームワークに付属することも •
DSLやORMの構文で記述する場合もある DBのマイグレーション
DSLとかORMとか…… こんなふうに思ったこと ありますよね?
SQLで書いたほうがはやい!!
データのコピーを伴うテーブル作成 • カラムを別テーブルに切り出す場合など • ORMでやると……SELECTして1件1件INSERT • SQLなら: INSERT INTO new_table
(id, col) SELECT id, col FROM old_table
オンラインでインデックス追加 • 長時間のロックを避けたい • M3 Tech Blog でも話題に ◦ 巨大テーブルにインデックスを追加したい、
Flywayで ◦ PostgresSQLの CREATE INDEX CONCURRENTLY • MySQLなら: CREATE INDEX … ALGORITHM=INPLACE, LOCK=NONE
マイグレーションもぜんぶ SQLで書きたい!
SQLで記述するマイグレーションツール • Flyway, Goose, … など • 自由なSQLが書ける • 適用履歴の管理などをしてくれる
SQLの整合性は管理してくれない (Up/Downの可逆性とか)
https:/ /github.com/makiuchi-d/migy
可逆性チェック • MySQL互換のDBエンジンを内蔵 ◦ go-mysql-server ◦ インプロセスDBとしてスタンドアロンで動作、 DBサーバ不要 1. チェックしたいマイグレーションの直前まで全部適用
2. スナップショット記録 3. UpのSQLを適用 4. DownのSQLを適用 5. スナップショットと現状を比較
可逆性チェック:スキーマ不一致 • テーブルの構造の一致しない部分を Diff表示 $ migy check applying: 000000_init.all.sql applying:
000010_create.up.sql ---- up/down applying: 000020_alter_add.up.sql applying: 000020_alter_add.down.sql checking... create table "table1" differs: ... `val` text NOT NULL DEFAULT '', + `val2` int DEFAULT '0', PRIMARY KEY (`id`) ... check failed
可逆性チェック:レコード不一致 • レコードの差分も検出(特定のカラムの違いは無視する指定も可能) $ migy check applying: 000030_insert.all.sql ---- up/down
applying: 000040_alter_drop.up.sql applying: 000040_alter_drop.down.sql checking... records in "table1" differs: (1, 'aaa', 10) -(2, 'bbb', 20) -(3, 'ccc', 30) +(2, 'aaa', 20) +(3, 'aaa', 30) check failed
SQLだけで完結する履歴管理 • ボイラープレート生成 ◦ Up: 履歴テーブルへの INSERT文 ◦ Down: 履歴の存在チェックと
DELETE文 • 本番サーバにツール不要 ◦ migyで列挙したSQLファイルをmysqlコマンドに流し込む ▪ .mylogin.cnf を活用できる -- Generated by migy (https://github.com/makiuchi-d/migy) INSERT INTO _migrations (id, title, applied) VALUES (10, 'user_table', now()); -- Write your forward migration SQL statements below. -- Generated by migy (https://github.com/makiuchi-d/migy) CALL _migration_exists(10); DELETE FROM _migrations WHERE id = 10; -- Write your rollback SQL statements below. user_table.up.sql user_table.down.sql
スナップショット( dump)生成 • マイグレーション適用済みの SQLダンプファイルを生成 ◦ Upを順に適用して出力 ◦ ALTERの積み重ねが適用済み •
テーブルの最新状態がわかる • 新規環境セットアップが迅速に
詳しくは技術同人誌に • KLab Tech Book Vol. 16 ◦ SQLによるDBマイグレーションの再設計 •
技術書典オンラインマーケット • 電子版無料
https:/ /github.com/makiuchi-d/migy