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
DBマイグレーションとORMについて
Search
toridori
September 28, 2024
Technology
0
230
DBマイグレーションとORMについて
toridori
September 28, 2024
Tweet
Share
More Decks by toridori
See All by toridori
Locustでmacから開発環境に負荷試験をしてみた
toridori_dev
0
200
N + 1 問題の概要と Railsにおける解決方法
toridori_dev
0
170
Aurora Cloneで QA環境をつくってみた
toridori_dev
0
250
ニューモーフィズムってどうなの
toridori_dev
0
400
toridori base webをv0で爆速で作った話
toridori_dev
0
200
ハイパーパラメータチューニングって何をしているの
toridori_dev
0
390
KoT APIでプチ業務改善を試してみた
toridori_dev
0
420
MUI DataGridProコンポーネントの紹介
toridori_dev
0
660
あの日行ったマージの仕組みを僕達はまだ知らない。
toridori_dev
0
310
Other Decks in Technology
See All in Technology
CoRL 2025 Survey
harukiabe
0
170
OCI Network Firewall 概要
oracle4engineer
PRO
2
7.9k
JAZUG 15周年記念 × JAT「AI Agent開発者必見:"今"のOracle技術で拡張するAzure × OCIの共存アーキテクチャ」
shisyu_gaku
1
160
Reflections of AI: A Trilogy in Four Parts (GOTO; Copenhagen 2025)
ondfisk
0
110
Adapty_東京AI祭ハッカソン2025ピッチスライド
shinoyamada
0
280
Where will it converge?
ibknadedeji
0
210
LLM時代にデータエンジニアの役割はどう変わるか?
ikkimiyazaki
6
1.3k
神回のメカニズムと再現方法/Mechanisms and Playbook for Kamikai scrumat2025
moriyuya
4
730
Performance Insights 廃止から Database Insights 利用へ/transition-from-performance-insights-to-database-insights
emiki
0
240
ガバメントクラウド(AWS)へのデータ移行戦略の立て方【虎の巻】 / 20251011 Mitsutosi Matsuo
shift_evolve
PRO
2
190
GoでもGUIアプリを作りたい!
kworkdev
PRO
0
140
「れきちず」のこれまでとこれから - 誰にでもわかりやすい歴史地図を目指して / FOSS4G 2025 Japan
hjmkth
1
300
Featured
See All Featured
Building a Scalable Design System with Sketch
lauravandoore
463
33k
The Invisible Side of Design
smashingmag
302
51k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
359
30k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.2k
Mobile First: as difficult as doing things right
swwweet
224
10k
We Have a Design System, Now What?
morganepeng
53
7.8k
Done Done
chrislema
185
16k
Making Projects Easy
brettharned
119
6.4k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Why You Should Never Use an ORM
jnunemaker
PRO
59
9.6k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Building an army of robots
kneath
306
46k
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 参考記事
ご清聴ありがとうございました