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
220
DBマイグレーションとORMについて
toridori
September 28, 2024
Tweet
Share
More Decks by toridori
See All by toridori
Locustでmacから開発環境に負荷試験をしてみた
toridori_dev
0
150
N + 1 問題の概要と Railsにおける解決方法
toridori_dev
0
130
Aurora Cloneで QA環境をつくってみた
toridori_dev
0
200
ニューモーフィズムってどうなの
toridori_dev
0
320
toridori base webをv0で爆速で作った話
toridori_dev
0
180
ハイパーパラメータチューニングって何をしているの
toridori_dev
0
340
KoT APIでプチ業務改善を試してみた
toridori_dev
0
330
MUI DataGridProコンポーネントの紹介
toridori_dev
0
550
あの日行ったマージの仕組みを僕達はまだ知らない。
toridori_dev
0
270
Other Decks in Technology
See All in Technology
[TechNight #90-1] 本当に使える?ZDMの新機能を実践検証してみた
oracle4engineer
PRO
3
160
Observability в PHP без боли. Олег Мифле, тимлид Altenar
lamodatech
0
330
ひとり情シスなCTOがLLMと始めるオペレーション最適化 / CTO's LLM-Powered Ops
yamitzky
0
420
Кто отправит outbox? Валентин Удальцов, автор канала Пых
lamodatech
0
330
フィンテック養成勉強会#54
finengine
0
160
AIの最新技術&テーマをつまんで紹介&フリートークするシリーズ #1 量子機械学習の入門
tkhresk
0
130
Microsoft Build 2025 技術/製品動向 for Microsoft Startup Tech Community
torumakabe
2
250
Model Mondays S2E02: Model Context Protocol
nitya
0
210
Clineを含めたAIエージェントを 大規模組織に導入し、投資対効果を考える / Introducing AI agents into your organization
i35_267
4
1.5k
25分で解説する「最小権限の原則」を実現するための AWS「ポリシー」大全 / 20250625-aws-summit-aws-policy
opelab
9
1k
データプラットフォーム技術におけるメダリオンアーキテクチャという考え方/DataPlatformWithMedallionArchitecture
smdmts
5
610
Amazon ECS & AWS Fargate 運用アーキテクチャ2025 / Amazon ECS and AWS Fargate Ops Architecture 2025
iselegant
16
5.3k
Featured
See All Featured
The Cost Of JavaScript in 2023
addyosmani
51
8.4k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
30
2.1k
Stop Working from a Prison Cell
hatefulcrawdad
270
20k
Adopting Sorbet at Scale
ufuk
77
9.4k
GraphQLの誤解/rethinking-graphql
sonatard
71
11k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
331
22k
Side Projects
sachag
455
42k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
2.9k
Being A Developer After 40
akosma
90
590k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Build The Right Thing And Hit Your Dates
maggiecrowley
36
2.8k
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 参考記事
ご清聴ありがとうございました