Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Migr8.rb チュートリアル

910 views

Published on

DBスキーママイグレーションツールである「Migr8.rb」の使い方を紹介

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Migr8.rb チュートリアル

  1. 1. 

  2. 2. $ rails generate migration CreateUsers $ ls db/migrate/ 20131104023129_create_users.rb
  3. 3. ## file: db/migrate/20131104023129_create_users.rb class CreateUsers < ActiveRecord::Migration def up create_table "users" do |t| t.string "name" t.string "email" end end def down drop_table "users" end end
  4. 4. ## バージョンを上げる $ rake db:migrate ## バージョンを戻す $ rake db:rollback ## 再実行(戻して、もう一度上げる) $ rake db:migrate:redo ## 現在のバージョンを調べる $ rake db:version Current version:20131104023129
  5. 5. postgres=> dt users; List of relations Schema ¦ Name ¦ Type ¦ Owner --------+-------+-------+-------- public ¦ users ¦ table ¦ myname (1 row) postgres=> select * from schema_migrations; version ---------------- 20131104023129 (1 row) 

  6. 6. 
 
 
 

  7. 7. ### Install $ curl -Lo migr8.rb http://bit.ly/migr8_rb $ chmod a+x ./migr8.rb ### Setup (PostgreSQL, MySQL, SQLite) $ export MIGR8_COMMAND="psql -qX -U user1 dbname" $ #export MIGR8_COMMAND="mysql -s -u user1 dbname" $ #export MIGR8_COMMAND="sqlite3 dbfile" ### Setup (Editor) $ export MIGR8_EDITOR="emacsclient -n" $ #export MIGR8_EDITOR="vim" $ #export MIGR8_EDITOR="open -a CotEditor"
  8. 8. ### ヘルプを表示 $ ./migr8.rb help ### 初期化 $ ./migr8.rb init ### ディレクトリが作られる $ ls -F migr8/ history.txt # ← バージョン番号の一覧 migrations/ # ← マイグレーションファイル置き場
  9. 9. $ ./migr8.rb new -m "create 'users' table" # or: ./migr8.rb new --table=users $ ls migr8/migrations scjs8350.yaml
  10. 10. # -*- coding: utf-8 -*- version: scjs8350 desc: create 'users' table author: alice vars: up: ¦ create table users ( id serial primary key name varchar(255) not null unique, ); down: ¦ drop table users;
  11. 11. # -*- coding: utf-8 -*- version: scjs8350 desc: create 'users' table author: alice vars: - table: users up: ¦ create table ${table} ( id serial primary key name varchar(255) not null unique, ); down: ¦ drop table ${table};
  12. 12. ### バージョンを上げる $ ./migr8.rb up ### バージョンを戻す $ ./migr8.rb down ### 再実行(戻して、もう一度上げる) $ ./migr8.rb redo ### 現在のバージョンを調べる
 $ ./migr8.rb status # 省略可 ...(snip)...
  13. 13. postgres=> dt users; List of relations Schema ¦ Name ¦ Type ¦ Owner --------+-------+-------+------- public ¦ users ¦ table ¦ user1 (1 row) postgres=> select id, version from _migr8_history; id | version --------------- 1 | scjs8350 (1 row) 

  14. 14. ### インデックスを追加 $ ./migr8.rb new --index=users.name $ ./migr8.rb up ### テーブルを追加 $ ./migr8.rb new --table=groups $ ./migr8.rb up ### カラムを追加 $ ./migr8.rb new --column=users.group_id
  15. 15. $ ./migr8.rb hist scjs8350 2013-11-07 23:01:13 # [john] create 'users' ewwg6691 2013-11-07 23:29:33 # [john] add index gnqc9473 2013-11-07 23:44:29 # [john] create 'groups' spvo5800 (not applied) # [john] add 'group_id' 

  16. 16. $ cat migr8/history.txt # -*- coding: utf-8 -*- scjs8350 # [john] create 'users' table ewwg6691 # [john] add index to 'users.name' gnqc9473 # [john] create 'groups' table spvo5800 # [john] add 'group_id' column
  17. 17.
  18. 18. # -*- coding: utf-8 -*- version: ewwg6691 desc: add index to 'users.name' author: john vars: - table: users - column: name - index: ${users}_${column}_idx up: ¦ create index ${index} on ${table}(${column}); down: ¦ drop index ${index};
  19. 19. # -*- coding: utf-8 -*- scjs8350 # [john] create 'users' table ewwg6691 # [john] add index to 'users.name' gnqc9473 # [john] create 'groups' table spvo5800 # [john] add 'group_id' column
  20. 20. create table _migr8_history ( id serial primary key , version varchar(40) not null unique , author varchar(40) not null , description varchar(255) not null , up_script text not null , down_script text not null , applied_at timestamp not null default timeofday() );
  21. 21.
  22. 22. begin; create table ...; insert into _migr8_history ...; create index ...; insert into _migr8_history ...; alter table ...; insert into _migr8_history ...; commit;
  23. 23. $ psql -qX -U user1 dbname < migr8/tmp.sql $ rm migr8/tmp.sql
  24. 24. psql=> select * from _migr8_history; .... -[ RECORD 23 ]--------------------------------------- id | 101 version | aaaa1111 up_script | create table ...(snip)... down_script | drop table ...(snip)... applied_at | 2014-01-01 12:34:56 -[ RECORD 24 ]--------------------------------------- id | 102 version | bbbb2222 up_script | create index ...(snip)... down_script | index table ...(snip)... applied_at | 2014-01-01 12:34:56 -[ RECORD 25 ]--------------------------------------- ....
  25. 25. up: | commit; alter type ... add value; begin;
  26. 26. 
 

  27. 27.
  28. 28. 
 
 # -*- coding: utf-8 -*- scjs8350 # [john] create 'users' ewwg6691 # [john] add index gnqc9473 # [alice] create 'groups' spvo5800 # [alice] add 'group_id' xmss3947 # [john] insert seed data
  29. 29. 
 
 

  30. 30. 
 # -*- coding: utf-8 -*- scjs8350 # [john] create 'users' ewwg6691 # [john] add index <<<<<<< HEAD gnqc9473 # [alice] create 'groups' spvo5800 # [alice] add 'group_id' ======= xmss3947 # [john] insert seed data >>>>>>> topicbranch
  31. 31. 
 
 $ ./migr8.rb hist scjs8350 2013-11-07 12:01:13 # [john] create 'users' gnqc9473 (not applied) # [alice] create 'groups' spvo5800 (not applied) # [alice] add 'group_id' ewwg6691 2013-11-08 20:29:33 # [john] add index $ ./migr8r.rb apply gnqc9473 spv05800
  32. 32. 
 
 
 
 
 
 

  33. 33.
  34. 34. 
 
 $ ./migr8.rb status ## Status: all applied ## Recent history: scjs8350 2013-11-07 12:01:13 # [john] create 'users' gnqc9473 2013-11-07 13:54:20 # [alice] create 'groups' ## !!! The following migrations are applied to DB, ## !!! but files are not found. ## !!! (Try `migr8.rb unapply -x abcd1234` to unapply them.) ewwg6691 2013-11-08 20:29:33 # [john] add index $ ./migr8r.rb unapply -x ewwg6691
  35. 35. 
 
 

  36. 36. 
 
 
 

  37. 37. 
 

  38. 38. $ ./migr8.rb readme ## readmeを表示 $ ./migr8.rb help ## ヘルプ $ ./migr8.rb init ## 初期化
  39. 39. $ ./migr8.rb new -h ## ヘルプ $ ./migr8.rb new -m "create table" ## 汎用 $ ./migr8.rb new --table=users ## テーブルを作成 $ ./migr8.rb new --column=users.name ## カラムを追加 $ ./migr8.rb new --index=users.name ## 索引を追加 $ ./migr8.rb new --unique=users.name ## 一意制約を追加
  40. 40. $ ./migr8.rb up -h ## ヘルプ $ ./migr8.rb up ## 1つだけ適用 (※1) $ ./migr8.rb up -n 3 ## 3つ適用 (※2) $ ./migr8.rb up -a ## 全部適用 (※3) (※1) 未適用のうち最も古いのを1つ適用 (※2) 未適用のうち古い順に3つ適用 (※3) 未適用のものを古い順に全部適用
  41. 41. $ ./migr8.rb down -h ## ヘルプ $ ./migr8.rb down ## 1つだけ戻す (※1) $ ./migr8.rb down -n 3 ## 3つ戻す (※2) $ ./migr8.rb down --ALL ## 全部戻す (※3) (※1) 適用済みのうち最も新しいものを1つ戻す (※2) 適用済みのうち新しい順に3つ戻す (※3) 適用済のものを新しい順に全部戻す
  42. 42. $ ./migr8.rb redo -h ## ヘルプ $ ./migr8.rb redo ## 1つだけ戻し、再度適用する $ ./migr8.rb redo -n 3 ## 3つ戻し、再度適用する $ ./migr8.rb redo --ALL ## 全部戻し、再度適用する
  43. 43. $ ./migr8.rb apply -h ## ヘルプ $ ./migr8.rb apply version ## 指定したのを適用 $ ./migr8.rb apply version1 version2 ... ## 複数指定も可
  44. 44. $ ./migr8.rb unapply -h ## ヘルプ $ ./migr8.rb unapply version ## 指定したのを適用 $ ./migr8.rb unapply version1 version2 ... ## 複数指定も可 $ ./migr8.rb unapply -x version ## ファイルがない場合(※) (※) unapply -x は、マイグレーションファイルを使わず、 DB内の履歴テーブルに格納された down 用 SQL を使う。 「適用されているけどファイルがないマイグレーション」を 戻すときはこの方法を使う。
  45. 45. $ ./migr8.rb show -h ## ヘルプ $ ./migr8.rb show version ## 内容を表示 (変数展開済) $ ./migr8.rb show ## 直近のバージョンが対象 $ ./migr8.rb show -x version ## DBテーブルから読み込む
  46. 46. $ ./migr8.rb edit -h ## ヘルプ $ ./migr8.rb edit version ## ファイルをエディタで開く $ ./migr8.rb edit ## 直近のバージョンが対象 $ ./migr8.rb edit -r N ## N個前のバージョンが対象 $ ./migr8.rb edit -e editor ## エディタを指定 (※1) (※1) デフォルトは $MIGR8_EDITOR で指定される
  47. 47. $ ./migr8.rb delete -h ## ヘルプ $ ./migr8.rb delete --Imsure version ## ファイルを削除(※) $ ./migr8.rb delete version ## (これは動作しない) (※) マイグレーションが適用済みならファイルは削除できない。
  48. 48. $ ./migr8.rb status -h ## ヘルプ $ ./migr8.rb status ## 直近の5個を表示 $ ./migr8.rb status -n N ## 直近のN個を表示 ##### 実行例:未適用があると教えてくれる $ ./migr8.rb status ## Status: YOU MUST APPLY spvo5800 AT FIRST! ## Recent history: scjs8350 2013-11-07 23:01:13 # [john] create 'users' ewwg6691 2013-11-07 23:29:33 # [john] add index gnqc9473 2013-11-07 23:44:29 # [alice] create 'groups' spvo5800 (not applied) # [alice] add 'group_id' xmss3947 2013-11-08 19:29:33 # [john] insert seed data
  49. 49. $ ./migr8.rb hist -h ## ヘルプ $ ./migr8.rb hist ## 履歴を表示 $ ./migr8.rb hist -o ## history.txtをエディタで開く $ ./migr8.rb hist -b ## 順番を保ったまま、
 ## history.txtを作り直す(※) (※) マイグレーションファイル内の摘要(description)と、 history.txt 内のコメントとが一致していないときに使う。

×