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
240
DBマイグレーションとORMについて
toridori
September 28, 2024
Tweet
Share
More Decks by toridori
See All by toridori
Locustでmacから開発環境に負荷試験をしてみた
toridori_dev
0
210
N + 1 問題の概要と Railsにおける解決方法
toridori_dev
0
170
Aurora Cloneで QA環境をつくってみた
toridori_dev
0
260
ニューモーフィズムってどうなの
toridori_dev
0
420
toridori base webをv0で爆速で作った話
toridori_dev
0
210
ハイパーパラメータチューニングって何をしているの
toridori_dev
0
400
KoT APIでプチ業務改善を試してみた
toridori_dev
0
450
MUI DataGridProコンポーネントの紹介
toridori_dev
0
670
あの日行ったマージの仕組みを僕達はまだ知らない。
toridori_dev
0
330
Other Decks in Technology
See All in Technology
3年ぶりの re:Invent 今年の意気込みと前回の振り返り
kazzpapa3
0
200
AWS資格は取ったけどIAMロールを腹落ちできてなかったので、年内に整理してみた
hiro_eng_
0
180
探求の技術
azukiazusa1
3
730
仕様駆動 x Codex で 超効率開発
ismk
2
1.3k
Snowflakeとdbtで加速する 「TVCMデータで価値を生む組織」への進化論 / Evolving TVCM Data Value in TELECY with Snowflake and dbt
carta_engineering
2
240
どうなる Remix 3
tanakahisateru
2
350
Amazon ECS デプロイツール ecspresso の開発を支える「正しい抽象化」の探求 / YAPC::Fukuoka 2025
fujiwara3
9
1.4k
AI時代におけるドメイン駆動設計 入門 / Introduction to Domain-Driven Design in the AI Era
fendo181
0
660
バグと向き合い、仕組みで防ぐ
____rina____
0
240
Rubyist入門: The Way to The Timeless Way of Programming
snoozer05
PRO
1
110
Copilotの精度を上げる!カスタムプロンプト入門.pdf
ismk
10
3.3k
Post-AIコーディング時代のエンジニア生存戦略
shinoyu
0
250
Featured
See All Featured
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.2k
Building Applications with DynamoDB
mza
96
6.7k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
658
61k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
359
30k
Docker and Python
trallard
46
3.6k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.8k
Building Flexible Design Systems
yeseniaperezcruz
329
39k
The Cult of Friendly URLs
andyhume
79
6.7k
How to Think Like a Performance Engineer
csswizardry
28
2.3k
Making Projects Easy
brettharned
120
6.4k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.7k
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 参考記事
ご清聴ありがとうございました