The project is in a healthy, maintained state
システムが稼働する上で最初から必要なデータ(マスタデータ)を管理するツールです。
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Project Readme

MasterDataTool

Build Status Gem Version Maintainability Test Coverage

システムが稼働する上で最初から必要なデータ(マスタデータ)を管理するツール

以下の機能を提供する

  • CSVからテーブルにデータを入れる
    • dry-runができる
    • 新規・更新・変更なし・削除がわかる
    • CSVのハッシュ値をDBに記録し差分があったテーブルのみ取り込みを実行する
  • 既存DBからCSVとしてデータをダンプする

前提条件

  • マスタデータの更新は同時並行で実行されない
  • db/fixtures/#{spec_name}/#{table_name}.csv の命名規則
    • 1DBの場合は db/fixtures/#{table_name}.csv

インストール

gem 'master_data_tool'

And then execute:

$ bundle install

Or install it yourself as:

$ gem install master_data_tool

初期設定

config/initializers/master_data_tool.rb

複数DB

Rails.application.reloader.to_prepare do
  MasterDataTool.configure do |config|
    primary_config = MasterDataTool::SpecConfig.new(
      spec_name: :primary,
      application_record_class: ::ApplicationRecord
    )

    animals_config = MasterDataTool::SpecConfig.new(
      spec_name: :animals,
      application_record_class: ::AnimalsRecord
    )

    config.spec_configs = [
      primary_config, animals_config
    ]
  end
end

単一DB

Rails.application.reloader.to_prepare do
  MasterDataTool.configure do |config|
    primary_config = MasterDataTool::SpecConfig.new(
      spec_name: '',
      application_record_class: ::ApplicationRecord
    )

    config.spec_configs = [
      primary_config
    ]
  end
end

Usage

はじめに

マスタデータとして扱うモデルには include MasterDataTool::ActAsMasterData を入れる

class Prefecture < ApplicationRecord
  include MasterDataTool::ActAsMasterData
end

マスタデータの投入

option default 内容
--spec-name nil 対象となるDBのspec name
--dry-run true dry-runモードで実行する(データ変更は行わない)
--verify true データ投入後に全テーブル・全レコードのバリデーションチェックを行う
--silent false 結果の出力をやめる
--override-identifier nil fixtures/#{override_identifier} のディレクトリにある内容でfixturesを上書きして投入する
--only-import-tables [] 指定したテーブルのみデータ投入を行う
--except-import-tables [] 指定したテーブルのデータ投入を行わない
--skip-no-change true CSVファイルに更新がないテーブルをスキップする
--ignore-foreign-key true 外部キー制約を無視する
--only-verify-tables [] 指定したテーブルのみ投入後のバリデーションチェックを行う
--except-verify-tables [] 指定したテーブルのバリデーションチェックを行わない
--preload-belongs-to-associations true belongs_toのアソシエーションをpreloadするかどうか
bundle exec master_data_tool import

すべてのDBに対してマスタデータの投入

bundle exec master_data_tool import_all

ダンプ

option default 内容
--spec-name nil 対象となるDBのspec name
--ignore-empty-table true 空のテーブルを無視する
--ignore-tables [] 指定したテーブルを無視する
--ignore-column-names [] 指定したカラムを無視する
--only-tables [] 指定したテーブルのみダンプする
--verbose false 詳細表示
bundle exec master_data_tool dump

マイグレーション

master_data_statuses というテーブルにCSVファイルのハッシュ値を記録し差分更新に利用する

bundle exec rails generate master_data_tool:install

を実行するとマイグレーションファイルが生成される。

ridgepoleの場合は以下のような定義で実行する

create_table 'master_data_statuses', id: :bigint, unsigned: true, force: :cascade, comment: "マスタデータの状態管理用テーブル" do |t|
  t.string   "name", limit: 255, null: false, comment: 'テーブル名'
  t.string   "version", limit: 255, null: false, comment: 'ハッシュ値'
  t.datetime "created_at", null: false, comment: '作成日時'
  t.datetime "updated_at", null: false, comment: '更新日時'
end

add_index 'master_data_statuses', ["name"], name: "idx_master_data_statuses_1", unique: true, using: :btree
add_index 'master_data_statuses', ["name", "version"], name: "idx_master_data_statuses_2", using: :btree

Tips

マスタデータ投入でどうなるか?を調べる

RAILS_ENV=development bundle exec master_data_tool import > /tmp/dry-run.txt
  • 影響を受けるテーブル
grep 'operation:affected_table' /tmp/dry-run.txt
  • 更新されるレコード
grep 'operation:import' /tmp/dry-run.txt | grep 'label:detail' | grep 'status:updated'
  • 削除されるレコード
grep 'operation:import' /tmp/dry-run.txt | grep 'label:detail' | grep 'status:deleted'
  • 追加されるレコード
grep 'operation:import' /tmp/dry-run.txt | grep 'label:detail' | grep 'status:new'

Test

docker-composeでMySQLを立ち上げてテストを実行する。

docker-compose up -d

以下のENVを設定すること。

export DB_HOST=127.0.0.1
export DB_PORT=`docker port master_data_tool-mysql 3306 | cut -f 2 -d ':'`
export DB_USERNAME=root
export DB_PASSWORD=f3WpxNreVT2NgQry
export DB_NAME=master_data_tool_test
  • dockerでMySQLを立ち上げるたびにポートは変わるのでDB_PORTは都度設定する
    • direnvを使っているならば direnv reload すればいい
make setup

rspec

bundle exec appraisal activerecord70 rspec
bundle exec appraisal activerecord71 rspec
bundle exec appraisal activerecord72 rspec

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/taka0125/master_data_tool.