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
SQLだけでマイグレーションしたい!
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
テストだけじゃない!インプロセスDBで生まれるGoらしさ
makki_d
0
47
テストだけじゃない!インプロセスDBで生まれるGoらしさ
makki_d
0
60
Recap: An Operating System in Go
makki_d
2
170
XSLTで作るBrainfuck処理系
makki_d
0
390
眼鏡と視力についての誤解を解く
makki_d
0
230
標準ライブラリの動向とイテレータのパフォーマンス
makki_d
3
780
range over funcのエラー処理
makki_d
1
1.8k
GoとテストとインプロセスDB
makki_d
3
700
君は古の言語M4を知っているか (LT)
makki_d
0
570
Other Decks in Technology
See All in Technology
2026TECHFRESH畢業分享會 - 葬送的通靈師:化系統與用戶雜訊成行動訊號
line_developers_tw
PRO
0
1k
20260619 私の日常業務での生成 AI 活用
masaruogura
1
200
AIはどのように 組織のアジリティを変えるのか?
junki
3
790
2026TECHFRESH畢業分享會 - Lightning Talk - E起 See See : 電商推薦讀心術? 數據說了算
line_developers_tw
PRO
0
1k
2026TECHFRESH畢業分享會 - Lightning Talk - 打造精準高效的 MCP 設計模式與測試實務
line_developers_tw
PRO
0
1k
Bedrock AgentCore RuntimeでAuth0 Changelog調査AIをアップグレードした話
t5u8a5a
1
140
フロンティアAIのゲート化と地政学リスク
nagatsu
0
140
データサイエンスを価値につなげるプロジェクト設計 〜 DS一年目が現場で得た気づき 〜
ysd113
1
240
失敗を資産に変えるClaude Code
shinyasaita
0
650
AIっぽい文章を採点して人間らしく直すアプリを作ってみた
yama3133
2
170
GitHub Copilot 最新アップデート – 「一歩先」の実践活用術
moulongzhang
2
340
やさしいA2A入門
minorun365
PRO
12
1.9k
Featured
See All Featured
How to Think Like a Performance Engineer
csswizardry
28
2.6k
Designing Experiences People Love
moore
143
24k
Are puppies a ranking factor?
jonoalderson
1
3.5k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
730
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
380
For a Future-Friendly Web
brad_frost
183
10k
Context Engineering - Making Every Token Count
addyosmani
9
960
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
2
850
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