Slide 1

Slide 1 text

DBマイグレーションとORM について 2024/9/27 開発部LT会 Akitoshi Matsuda

Slide 2

Slide 2 text

名前: Akitoshi Matsuda 最近の仕事: ・**チームの業務改善システム開発、運用 ・DevRelチームとしての活動 最近の興味: ・DDD(ドメイン駆動設計) ・DevRelとしての活動強化 ・バルクアップ 自己紹介

Slide 3

Slide 3 text

1. DBマイグレーションに関わる用語や概念を理解する 2. DBマイグレーションの具体的手順を知る 3. Drizzleの利点と課題感を知る まとめ 参考記事 今回のテーマ

Slide 4

Slide 4 text

(1)DBマイグレーションに関わる 用語や概念を理解する

Slide 5

Slide 5 text

マイグレーションとは?

Slide 6

Slide 6 text

・移行、移動というような概念 ・IT文脈でいうと、「システムの移行」「DBのテーブル更新」  といったような場面で使用される ・「DBのテーブル更新」であることを明示的にするには  「DBマイグレーション」というのが適切 マイグレーションとは?

Slide 7

Slide 7 text

1. 新しいテーブル情報の準備(荷造り) 2. マイグレーションの実行(引越) 3. 新しい状態リリース(ご挨拶) マイグレーションとは? 新しいバージョンの システムです #$_(%$*_@#&*_@ Q)#*)%$_*(#&$!!! ロールバック

Slide 8

Slide 8 text

スキーマ/マイグレーション/ORM の関係性

Slide 9

Slide 9 text

・スキーマ  →言葉としては「何かの構造」を指している  →IT文脈で言うと「データベースの構造を表現する設計図」を主に指す ・マイグレーション  →データベーススキーマの変更を管理・適用するプロセス ・マイグレーションファイル  →マイグレーションプロセスのための具体的な指示を含むファイル ・ORM  →オブジェクト関係マッピング(Object-Relational Mapping)  →SQLを直接書くことなく、データの操作ができるもの  →プログラミング言語同様、多くの種類がある スキーマ/マイグレーション/ORMの関係性

Slide 10

Slide 10 text

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)

Slide 11

Slide 11 text

ORMサンプル(Ruby on railsのActive Record) DB SQL ORM users = User.all

Slide 12

Slide 12 text

ORMサンプル(Ruby on railsのActive Record) DB SQL ORM users = User.all 細かいクエリを意識 しなくて済む

Slide 13

Slide 13 text

1. スキーマ(設計図) 2. マイグレーションの実行(引越) 3. 欲しいものを取り出す際に使う指示プログラム(ORMクエリ) スキーマ/マイグレーション/ORMの関係性 posts comments users DB users = User.all

Slide 14

Slide 14 text

(2)DBマイグレーションの 具体的手順を知る

Slide 15

Slide 15 text

・今回はDrizzleというORMを使った例を見ていきます ・Drizzleのマイグレーションの仕組みはRailsと似ていますが、少し異なります DBマイグレーションの具体的手順

Slide 16

Slide 16 text

Rails 1. マイグレーションファイルを作成  (rails g migration ***) 2. migrationを実行(rails g migrate) 3. schemaが更新される Drizzle 1. schemaファイルを更新(手動) 2. マイグレーションファイルを作成  (npx drizzle-kit generate ***) 3. migrationを実行 DBマイグレーションの具体的手順 完成状態から定義し反映させ、 変更履歴をマイグレーション ファイルで管理している 変更内容から定義し反映させ、 schemaが更新されていく

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

(3)Drizzleの利点と課題感を知る

Slide 19

Slide 19 text

<利点> ・TypeScriptベースなので型安全性がある ・複数のデータベースに対応 ・SQLライクなORMなのでキャッチアップが短く済む  →小〜中規模のサービスにおすすめ <課題感> ・seedの仕組みがない点 ・マイグレーションコンフリクトが起こりやすい構造である点 ・エコシステムの成熟度や記事などの情報量不足な点 Drizzleの利点と課題感を知る

Slide 20

Slide 20 text

<利点> ・TypeScriptベースなので型安全性がある ・複数のデータベースに対応 ・SQLライクなORMなのでキャッチアップが短く済む  →小〜中規模のサービスにおすすめ <課題感> ・seedの仕組みがない点 ・マイグレーションコンフリクトが起こりやすい構造である点 ・エコシステムの成熟度や記事などの情報量不足な点 Drizzleの利点と課題感を知る

Slide 21

Slide 21 text

Drizzleの課題感 (マイグレーションコンフリクト)

Slide 22

Slide 22 text

前提:2人の開発者が同じシステムの開発を進めています マイグレーションコンフリクト develop 8/1 usersにage追加 8/1 両者ブランチ作成 8/2 マージ 8/2 usersにname追加、 PR作成しようとする コンフリ _journal.json ****_snapshot.json の書き換えが必要

Slide 23

Slide 23 text

マイグレーションコンフリクト ・マイグレーションファイルを作成した履歴が 書かれている 先ほどの例で、idx=1が8/1のdevelopの状態で あった場合 次にできるsqlファイルはidx=2のものとなる ↓ 同じ_journal.jsonに対して更新がされるためコ ンフリクトが生じる ↓ 手作業修正が必要で面倒

Slide 24

Slide 24 text

マイグレーションコンフリクト develop 8/1 usersにage追加 8/1 ブランチ作成 8/2 マージ 8/2 usersにname追加、 PR作成しようとする コンフリ _journal.json ****_snapshot.json の書き換えが必要 schema 変えたんでよろ

Slide 25

Slide 25 text

対策 (1)ローカルでは、マイグレーションファイル生成をせずにpush運用にする (2)リリース時は、マイグレーションファイル生成をCIにて行うようにする マイグレーションコンフリクト

Slide 26

Slide 26 text

(1)ローカルでは、マイグレーションファイル生成をせずにpush運用にする マイグレーションコンフリクト ローカル開発時の対策 develop 8/1 usersにage追加 8/1 ブランチ作成 8/2 マージ 8/2 usersにname追加 schema書き換え てpush schema書き換え てpush うおおおおおお!

Slide 27

Slide 27 text

マイグレーションコンフリクト リリース時の対策 develop 1.リリースブランチ作成 2.PR作成 (2)リリース時は、マイグレーションファイル生成をCIにて行うようにする 4.更新があった場合はさらに  コミットが追加される mainなど 5.マージ 3.マイグレーションファイル  が追加されたコミット

Slide 28

Slide 28 text

1. DBマイグレーションに関わる用語や概念を理解する 2. DBマイグレーションの具体的手順を知る 3. Drizzleの利点と課題感を知る まとめ

Slide 29

Slide 29 text

データベースの概念スキーマ、外部スキーマ、内部スキーマ 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 参考記事

Slide 30

Slide 30 text

ご清聴ありがとうございました