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
190
DBマイグレーションとORMについて
toridori
September 28, 2024
Tweet
Share
More Decks by toridori
See All by toridori
Locustでmacから開発環境に負荷試験をしてみた
toridori_dev
0
79
N + 1 問題の概要と Railsにおける解決方法
toridori_dev
0
73
Aurora Cloneで QA環境をつくってみた
toridori_dev
0
110
ニューモーフィズムってどうなの
toridori_dev
0
200
toridori base webをv0で爆速で作った話
toridori_dev
0
130
ハイパーパラメータチューニングって何をしているの
toridori_dev
0
230
KoT APIでプチ業務改善を試してみた
toridori_dev
0
200
MUI DataGridProコンポーネントの紹介
toridori_dev
0
420
あの日行ったマージの仕組みを僕達はまだ知らない。
toridori_dev
0
220
Other Decks in Technology
See All in Technology
転生CISOサバイバル・ガイド / CISO Career Transition Survival Guide
kanny
3
920
Data-centric AI入門第6章:Data-centric AIの実践例
x_ttyszk
1
390
Datadogとともにオブザーバビリティを布教しよう
mego2221
0
130
ホワイトボードチャレンジ 説明&実行資料
ichimichi
0
120
データ資産をシームレスに伝達するためのイベント駆動型アーキテクチャ
kakehashi
PRO
2
470
Moved to https://speakerdeck.com/toshihue/presales-engineer-career-bridging-tech-biz-ja
toshihue
2
670
レビューを増やしつつ 高評価維持するテクニック
tsuzuki817
1
480
技術負債の「予兆検知」と「状況異変」のススメ / Technology Dept
i35_267
1
1k
スタートアップ1人目QAエンジニアが QAチームを立ち上げ、“個”からチーム、 そして“組織”に成長するまで / How to set up QA team at reiwatravel
mii3king
2
1.3k
MC906491 を見据えた Microsoft Entra Connect アップグレード対応
tamaiyutaro
1
520
Postman Flowsの基本 / Postman Flows Basics
yokawasa
1
100
なぜ私は自分が使わないサービスを作るのか? / Why would I create a service that I would not use?
aiandrox
0
510
Featured
See All Featured
Side Projects
sachag
452
42k
Building Adaptive Systems
keathley
40
2.4k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Measuring & Analyzing Core Web Vitals
bluesmoon
6
240
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.3k
Typedesign – Prime Four
hannesfritz
40
2.5k
Practical Orchestrator
shlominoach
186
10k
Designing on Purpose - Digital PM Summit 2013
jponch
117
7.1k
BBQ
matthewcrist
86
9.5k
Why Our Code Smells
bkeepers
PRO
336
57k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
44
9.4k
Automating Front-end Workflow
addyosmani
1367
200k
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 参考記事
ご清聴ありがとうございました