504 Views
November 27, 24
スライド概要
Tsukulink Tech Talk 〜Kaigi on Rails After LT会〜 #4
https://tsukulink.connpass.com/event/334880/
がんばります
Data Migration on Rails ツクリンクの場合 #つくてくトーク ツクリンク株式会社 あっきー(@kuronekopunk)
⾃⼰紹介 ● あっきー @kuronekopunk ● ツクリンク株式会社 ● 経歴 ○ ○ エンジニアリングマネージャー 2011年 新卒 SESでPHP 2012年 ㈱ハンズシェア創業(現:ツクリンク㈱) ■ ツクリンクの0→1の開発 ■ PHP→Railsのリプレース ■ SEO、グロースハック ■ データアナリスト ■ 採⽤広報 ● イベント『EMゆるミートアップ』『カクカクシカジカモデリング』 ● ポッドキャスト『ぐんぐんfm』
Kaigi on Rails 2024 出展:https://kaigionrails.org/2024/
『Data Migration on Rails』@ohbarye 出展:https://speakerdeck.com/ohbarye/data-migration-on-rails
Data Migrationとは ⼤きく分けて2つ 1. データベース全体の移⾏や変更 2. 特定のデータの変更や移⾏ 2の特定のデータ変更についてを今回の対象とします。 出展:Data Migration on Rails p.3
Data Migrationの代表的なアプローチ 1. SQLによる直接データ操作 2. rails console, rails runner 3. db:migrateと同時に実⾏ 4. rake task, ruby scriptを実⾏ 5. 専⽤gemの活⽤ 出展:Data Migration on Rails p.20
Data Migration on Rails ツクリンクの場合
データ変更をするユースケース ● DB migrationに伴うデータ変更 ● 不具合による不整合データの修正 ● CSからの依頼でデータ更新
DB migrationに伴うデータ変更
DB migrationに伴うデータ変更 新しいカラムを作り、既存データから算出できるデータを埋めるケースです。 migrationファイル内でデータ変更を ⾏っているファイルを⾒つけました。 最新が202206のファイルで最近はこの形式で data migrationは⾏われていないようでした。
マイグレーションファイルでデータ操作は⾮推奨 データをマイグレーションすると、データベース内でデータが変換されたり移動したりします。Railsで は⼀般的に、マイグレーションファイルでデータを操作することは推奨されません。 出展:Active Record マイグレーション - Railsガイド
DB migrationに伴うデータ変更 直近のデータ変更ではfeatureトグルを利⽤した機能制御と合わせて以下のステッ プでデータ変更が⾏われています。 1. データ変更を⾏わないDB変更のみのdb:migrateを実⾏ 2. rake taskでデータ変更 3. データに問題がなければfeatureトグルを利⽤し機能を有効化
不具合による不整合データの修正
不具合による不整合データの修正 不具合や過去データと整合性が取れなくなり想定外のデータが⾒つかり修正するケース 即時データ変更をしないとユーザーが使えないなどのクリティカルな場合 →rails consoleでデータ修正の実⾏ 直接の不具合は出ないもののデータ不整合の場合 →rake taskでテストを書きつつ安全にデータ変更
CSからの依頼でデータ更新
CSからの依頼でデータ更新 前提:ツクリンクではユーザーさんのサポートで情報変更をするための管理画⾯があります 管理画⾯でできないデータ変更をCSから依頼されるケースがあり、エンジニアが直接データ変更をする ことがあります。
rails consoleで実⾏ 機能として存在しないものはエンジニアがスクリプトを作りconsoleで実⾏しています。 ● スクリプト作成 ○ 再利⽤可能にする ○ ログ出⼒をする ● 実⾏の際はSlackでレビュー依頼 ● ドキュメント化 ● 機能化が必要な場合はチケット発⾏ ※再利⽤可能なイメージ
rake taskで実⾏ 管理画⾯への追加が難しい場合、⼀旦対応スクリプトをrake task化しています。 テストも書けるためrails consoleのスクリプト実⾏よりは安全に実⾏できるようになっています。
maintenance_tasksを試してみた
maintenance_tasksをインストール インストールすると以下が実⾏される ● routesの追加 ● DBセットアップ
maintenance_tasksの管理画⾯ /maintenance_tasks で管理画⾯が開けるようになった
maintenance_tasksで新しいタスクを作る app/tasks/ 配下に作られるのが良かった ※そもそもrake taskが lib/tasks/ なのってなんでなんだろう...
maintenance_tasksで新しいタスクを作る(collection⽤) ※適当なcollectionを回すだけのサンプル
maintenance_tasksで新しいタスクを作る(no-collection) collectionを使わないタスクも作成可能
管理画⾯でタスクを確認する タスク詳細 タスク⼀覧 実⾏結果
引数、バリデーションが便利 attribute, validatesを簡単に定義できる 管理画⾯から引数を指定して簡単に実⾏
引数を指定した実⾏履歴も確認可能 例:attribute title に “new title” を指定
maintenance_tasksのちょっと気になり 1. 権限管理は独⾃で作る必要がありそう? 2. task内で⾊々やるより対象Jobをキックする⽤途は使いやすそう
さいごに より良い知⾒を取り⼊れ、検証をして、安全かつベターなやり⽅に変更していけ ればと思います。 maintenance_tasksの上⼿い使い⽅や、その他運⽤⽅法など良いものがあればぜ ひ教えてください🙌
Thanks. 🙌