Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
DBマイグレーションとORMについて
Search
toridori
September 28, 2024
Technology
0
260
DBマイグレーションとORMについて
toridori
September 28, 2024
Tweet
Share
More Decks by toridori
See All by toridori
Locustでmacから開発環境に負荷試験をしてみた
toridori_dev
0
230
N + 1 問題の概要と Railsにおける解決方法
toridori_dev
0
180
Aurora Cloneで QA環境をつくってみた
toridori_dev
0
270
ニューモーフィズムってどうなの
toridori_dev
0
460
toridori base webをv0で爆速で作った話
toridori_dev
0
220
ハイパーパラメータチューニングって何をしているの
toridori_dev
0
420
KoT APIでプチ業務改善を試してみた
toridori_dev
0
480
MUI DataGridProコンポーネントの紹介
toridori_dev
0
700
あの日行ったマージの仕組みを僕達はまだ知らない。
toridori_dev
0
350
Other Decks in Technology
See All in Technology
生成AI時代におけるグローバル戦略思考
taka_aki
0
210
「図面」から「法則」へ 〜メタ視点で読み解く現代のソフトウェアアーキテクチャ〜
scova0731
0
430
Connection-based OAuthから学ぶOAuth for AI Agents
flatt_security
0
190
AgentCore BrowserとClaude Codeスキルを活用した 『初手AI』を実現する業務自動化AIエージェント基盤
ruzia
5
390
Agent Skillsがハーネスの垣根を超える日
gotalab555
5
1.9k
Snowflake導入から1年、LayerXのデータ活用の現在 / One Year into Snowflake: How LayerX Uses Data Today
civitaspo
0
160
AIの長期記憶と短期記憶の違いについてAgentCoreを例に深掘ってみた
yakumo
4
470
AWS re:Invent 2025 re:Cap LT大会 データベース好きが語る re:Invent 2025 データベースアップデート/セッションの紹介
coldairflow
0
130
ハッカソンから社内プロダクトへ AIエージェント「ko☆shi」開発で学んだ4つの重要要素
sonoda_mj
6
990
AWS運用を効率化する!AWS Organizationsを軸にした一元管理の実践/nikkei-tech-talk-202512
nikkei_engineer_recruiting
0
140
AIプラットフォームにおけるMLflowの利用について
lycorptech_jp
PRO
1
180
AI時代のワークフロー設計〜Durable Functions / Step Functions / Strands Agents を添えて〜
yakumo
3
1.5k
Featured
See All Featured
Producing Creativity
orderedlist
PRO
348
40k
Six Lessons from altMBA
skipperchong
29
4.1k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
30
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
87
Rebuilding a faster, lazier Slack
samanthasiow
85
9.3k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
359
30k
How to Talk to Developers About Accessibility
jct
1
81
Making the Leap to Tech Lead
cromwellryan
135
9.7k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
77
The untapped power of vector embeddings
frankvandijk
1
1.5k
The Invisible Side of Design
smashingmag
302
51k
Transcript
DBマイグレーションとORM について 2024/9/27 開発部LT会 Akitoshi Matsuda
名前: Akitoshi Matsuda 最近の仕事: ・**チームの業務改善システム開発、運用 ・DevRelチームとしての活動 最近の興味: ・DDD(ドメイン駆動設計) ・DevRelとしての活動強化 ・バルクアップ
自己紹介
1. DBマイグレーションに関わる用語や概念を理解する 2. DBマイグレーションの具体的手順を知る 3. Drizzleの利点と課題感を知る まとめ 参考記事 今回のテーマ
(1)DBマイグレーションに関わる 用語や概念を理解する
マイグレーションとは?
・移行、移動というような概念 ・IT文脈でいうと、「システムの移行」「DBのテーブル更新」 といったような場面で使用される ・「DBのテーブル更新」であることを明示的にするには 「DBマイグレーション」というのが適切 マイグレーションとは?
1. 新しいテーブル情報の準備(荷造り) 2. マイグレーションの実行(引越) 3. 新しい状態リリース(ご挨拶) マイグレーションとは? 新しいバージョンの システムです #$_(%$*_@#&*_@
Q)#*)%$_*(#&$!!! ロールバック
スキーマ/マイグレーション/ORM の関係性
・スキーマ →言葉としては「何かの構造」を指している →IT文脈で言うと「データベースの構造を表現する設計図」を主に指す ・マイグレーション →データベーススキーマの変更を管理・適用するプロセス ・マイグレーションファイル →マイグレーションプロセスのための具体的な指示を含むファイル ・ORM →オブジェクト関係マッピング(Object-Relational Mapping)
→SQLを直接書くことなく、データの操作ができるもの →プログラミング言語同様、多くの種類がある スキーマ/マイグレーション/ORMの関係性
SQL users = Array.new sql = "SELECT * FROM users"
rows = some_sql_module.query(sql); rows.each do |row| user = User.new; user.id = row[:id] user.name = row[:name] user.email = row[:email] users << user end Active Record users = User.all ORMサンプル(Ruby on railsのActive Record)
ORMサンプル(Ruby on railsのActive Record) DB SQL ORM users = User.all
ORMサンプル(Ruby on railsのActive Record) DB SQL ORM users = User.all
細かいクエリを意識 しなくて済む
1. スキーマ(設計図) 2. マイグレーションの実行(引越) 3. 欲しいものを取り出す際に使う指示プログラム(ORMクエリ) スキーマ/マイグレーション/ORMの関係性 posts comments users
DB users = User.all
(2)DBマイグレーションの 具体的手順を知る
・今回はDrizzleというORMを使った例を見ていきます ・Drizzleのマイグレーションの仕組みはRailsと似ていますが、少し異なります DBマイグレーションの具体的手順
Rails 1. マイグレーションファイルを作成 (rails g migration ***) 2. migrationを実行(rails g
migrate) 3. schemaが更新される Drizzle 1. schemaファイルを更新(手動) 2. マイグレーションファイルを作成 (npx drizzle-kit generate ***) 3. migrationを実行 DBマイグレーションの具体的手順 完成状態から定義し反映させ、 変更履歴をマイグレーション ファイルで管理している 変更内容から定義し反映させ、 schemaが更新されていく
Rails 1. マイグレーションファイルを作成 (rails g migration ***) 2. migrationを実行(rails g
migrate) 3. schemaが更新される Drizzle 1. schemaファイルを更新(手動) 2. マイグレーションファイルを作成 (npx drizzle-kit generate ***) 3. migrationを実行 DBマイグレーションの具体的手順 20240927025614_create_sample_table.rb 0000_known_mystique.sql
(3)Drizzleの利点と課題感を知る
<利点> ・TypeScriptベースなので型安全性がある ・複数のデータベースに対応 ・SQLライクなORMなのでキャッチアップが短く済む →小〜中規模のサービスにおすすめ <課題感> ・seedの仕組みがない点 ・マイグレーションコンフリクトが起こりやすい構造である点 ・エコシステムの成熟度や記事などの情報量不足な点 Drizzleの利点と課題感を知る
<利点> ・TypeScriptベースなので型安全性がある ・複数のデータベースに対応 ・SQLライクなORMなのでキャッチアップが短く済む →小〜中規模のサービスにおすすめ <課題感> ・seedの仕組みがない点 ・マイグレーションコンフリクトが起こりやすい構造である点 ・エコシステムの成熟度や記事などの情報量不足な点 Drizzleの利点と課題感を知る
Drizzleの課題感 (マイグレーションコンフリクト)
前提:2人の開発者が同じシステムの開発を進めています マイグレーションコンフリクト develop 8/1 usersにage追加 8/1 両者ブランチ作成 8/2 マージ 8/2
usersにname追加、 PR作成しようとする コンフリ _journal.json ****_snapshot.json の書き換えが必要
マイグレーションコンフリクト ・マイグレーションファイルを作成した履歴が 書かれている 先ほどの例で、idx=1が8/1のdevelopの状態で あった場合 次にできるsqlファイルはidx=2のものとなる ↓ 同じ_journal.jsonに対して更新がされるためコ ンフリクトが生じる ↓
手作業修正が必要で面倒
マイグレーションコンフリクト develop 8/1 usersにage追加 8/1 ブランチ作成 8/2 マージ 8/2 usersにname追加、
PR作成しようとする コンフリ _journal.json ****_snapshot.json の書き換えが必要 schema 変えたんでよろ
対策 (1)ローカルでは、マイグレーションファイル生成をせずにpush運用にする (2)リリース時は、マイグレーションファイル生成をCIにて行うようにする マイグレーションコンフリクト
(1)ローカルでは、マイグレーションファイル生成をせずにpush運用にする マイグレーションコンフリクト ローカル開発時の対策 develop 8/1 usersにage追加 8/1 ブランチ作成 8/2 マージ 8/2
usersにname追加 schema書き換え てpush schema書き換え てpush うおおおおおお!
マイグレーションコンフリクト リリース時の対策 develop 1.リリースブランチ作成 2.PR作成 (2)リリース時は、マイグレーションファイル生成をCIにて行うようにする 4.更新があった場合はさらに コミットが追加される mainなど 5.マージ 3.マイグレーションファイル
が追加されたコミット
1. DBマイグレーションに関わる用語や概念を理解する 2. DBマイグレーションの具体的手順を知る 3. Drizzleの利点と課題感を知る まとめ
データベースの概念スキーマ、外部スキーマ、内部スキーマ https://qiita.com/lymansouka2017/items/615dac8890e39a4da86e ORMの概念理解 https://qiita.com/minimabot/items/0a3fcc41fd7140dfdc41 これから始めるDrizzleORM:導入〜実装まで https://zenn.dev/toridori/articles/9c41d1fd7f6a85 [GitHub discussion]Best way to
deal with migration merge conflicts? https://github.com/drizzle-team/drizzle-orm/discussions/1104 参考記事
ご清聴ありがとうございました