Migr8.rb チュートリアル


Migr8.rb チュートリアル
Migr8.rb チュートリアル
$ rails generate migration CreateUsers
$ ls db/migrate/
20131104023129_create_users.rb
## 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
## バージョンを上げる
$ rake db:migrate
## バージョンを戻す
$ rake db:rollback
## 再実行(戻して、もう一度上げる)
$ rake db:migrate:redo
## 現在のバージョンを調べる
$ rake db:version
Current version:20131104023129
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)


Migr8.rb チュートリアル
Migr8.rb チュートリアル








### 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"
### ヘルプを表示
$ ./migr8.rb help
### 初期化
$ ./migr8.rb init
### ディレクトリが作られる
$ ls -F migr8/
history.txt # ← バージョン番号の一覧
migrations/ # ← マイグレーションファイル置き場
$ ./migr8.rb new -m "create 'users' table"
# or: ./migr8.rb new --table=users
$ ls migr8/migrations
scjs8350.yaml
# -*- 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;
# -*- 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};
### バージョンを上げる
$ ./migr8.rb up
### バージョンを戻す
$ ./migr8.rb down
### 再実行(戻して、もう一度上げる)
$ ./migr8.rb redo
### 現在のバージョンを調べる

$ ./migr8.rb status # 省略可
...(snip)...
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)


### インデックスを追加
$ ./migr8.rb new --index=users.name
$ ./migr8.rb up
### テーブルを追加
$ ./migr8.rb new --table=groups
$ ./migr8.rb up
### カラムを追加
$ ./migr8.rb new --column=users.group_id
$ ./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'


$ 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
Migr8.rb チュートリアル


# -*- 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};
# -*- 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
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()
);


begin;
create table ...;
insert into _migr8_history ...;
create index ...;
insert into _migr8_history ...;
alter table ...;
insert into _migr8_history ...;
commit;
$ psql -qX -U user1 dbname < migr8/tmp.sql
$ rm migr8/tmp.sql
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 ]---------------------------------------
....
up: |
commit;
alter type ... add value;
begin;
Migr8.rb チュートリアル
Migr8.rb チュートリアル










# -*- 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






Migr8.rb チュートリアル


# -*- 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
Migr8.rb チュートリアル
Migr8.rb チュートリアル




$ ./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




















$ ./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









 



Migr8.rb チュートリアル
Migr8.rb チュートリアル




Migr8.rb チュートリアル
$ ./migr8.rb readme ## readmeを表示
$ ./migr8.rb help ## ヘルプ
$ ./migr8.rb init ## 初期化
$ ./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 ## 一意制約を追加
$ ./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) 未適用のものを古い順に全部適用
$ ./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) 適用済のものを新しい順に全部戻す
$ ./migr8.rb redo -h ## ヘルプ
$ ./migr8.rb redo ## 1つだけ戻し、再度適用する
$ ./migr8.rb redo -n 3 ## 3つ戻し、再度適用する
$ ./migr8.rb redo --ALL ## 全部戻し、再度適用する
$ ./migr8.rb apply -h ## ヘルプ
$ ./migr8.rb apply version ## 指定したのを適用
$ ./migr8.rb apply version1 version2 ... ## 複数指定も可
$ ./migr8.rb unapply -h ## ヘルプ
$ ./migr8.rb unapply version ## 指定したのを適用
$ ./migr8.rb unapply version1 version2 ... ## 複数指定も可
$ ./migr8.rb unapply -x version ## ファイルがない場合(※)
(※) unapply -x は、マイグレーションファイルを使わず、
DB内の履歴テーブルに格納された down 用 SQL を使う。
「適用されているけどファイルがないマイグレーション」を
戻すときはこの方法を使う。
$ ./migr8.rb show -h ## ヘルプ
$ ./migr8.rb show version ## 内容を表示 (変数展開済)
$ ./migr8.rb show ## 直近のバージョンが対象
$ ./migr8.rb show -x version ## DBテーブルから読み込む
$ ./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 で指定される
$ ./migr8.rb delete -h ## ヘルプ
$ ./migr8.rb delete --Imsure version ## ファイルを削除(※)
$ ./migr8.rb delete version ## (これは動作しない)
(※) マイグレーションが適用済みならファイルは削除できない。
$ ./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
$ ./migr8.rb hist -h ## ヘルプ
$ ./migr8.rb hist ## 履歴を表示
$ ./migr8.rb hist -o ## history.txtをエディタで開く
$ ./migr8.rb hist -b ## 順番を保ったまま、

## history.txtを作り直す(※)
(※) マイグレーションファイル内の摘要(description)と、
history.txt 内のコメントとが一致していないときに使う。
Migr8.rb チュートリアル

More Related Content

PDF
DBスキーマもバージョン管理したい!
PDF
Where狙いのキー、order by狙いのキー
PDF
SQLアンチパターン - ジェイウォーク
PPTX
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
PDF
Burp Suite 2.0触ってみた
PDF
ヤフー社内でやってるMySQLチューニングセミナー大公開
PDF
C・C++用のコードカバレッジツールを自作してみた話
PDF
MesonでPostgreSQLをビルドしてみよう!(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)
DBスキーマもバージョン管理したい!
Where狙いのキー、order by狙いのキー
SQLアンチパターン - ジェイウォーク
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
Burp Suite 2.0触ってみた
ヤフー社内でやってるMySQLチューニングセミナー大公開
C・C++用のコードカバレッジツールを自作してみた話
MesonでPostgreSQLをビルドしてみよう!(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)

What's hot (20)

PDF
MySQLレプリケーションあれやこれや
PPTX
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PDF
とある診断員と色々厄介な脆弱性達
PPTX
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
PDF
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
PDF
Web エンジニアが postgre sql を選ぶ 3 つの理由
PDF
[AKIBA.AWS] VPN接続とルーティングの基礎
PDF
TRICK 2022 Results
PDF
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
PPTX
Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理
PDF
MySQL 5.7にやられないためにおぼえておいてほしいこと
PDF
MongoDB概要:金融業界でのMongoDB
PDF
ゲームのインフラをAwsで実戦tips全て見せます
PDF
ドメインオブジェクトの見つけ方・作り方・育て方
PDF
Kubernetes環境で実現するWebアプリケーションセキュリティ
PDF
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PDF
基本に戻ってInnoDBの話をします
PDF
Hyper vを理解する
PDF
外部キー制約に伴うロックの小話
PDF
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
MySQLレプリケーションあれやこれや
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
とある診断員と色々厄介な脆弱性達
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
Web エンジニアが postgre sql を選ぶ 3 つの理由
[AKIBA.AWS] VPN接続とルーティングの基礎
TRICK 2022 Results
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理
MySQL 5.7にやられないためにおぼえておいてほしいこと
MongoDB概要:金融業界でのMongoDB
ゲームのインフラをAwsで実戦tips全て見せます
ドメインオブジェクトの見つけ方・作り方・育て方
Kubernetes環境で実現するWebアプリケーションセキュリティ
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
基本に戻ってInnoDBの話をします
Hyper vを理解する
外部キー制約に伴うロックの小話
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Ad

Viewers also liked (20)

PDF
Osc2015 hokkaido postgresql-semi-stuructured-datatype
PPTX
レシピブログのサービス設計と今後の展望
PDF
Lagom で学ぶ Reactive Microservices Architecture @ 第3回Reactive System Meetup i...
PDF
今すぐ使えるクラウドとPostgreSQL
PPTX
HAWQをCDHで動かしてみた
PDF
PostgreSQLアーキテクチャ入門
PDF
Ivsctonightandday2016winter moringsession awsreinvent2016recap
PDF
初心者がAWSでWebサービスを始めるまで 〜たった3ステップでWebページは公開できる〜
PPTX
【自社プロダクト開発エンジニア募集中】エーピーコミュニケーションズ 先進開発グループ
PDF
[D31] PostgreSQLでスケールアウト構成を構築しよう by Yugo Nagata
PDF
最上級の簡易性を備えたオープンソースDBクラウド基盤 Composeのご紹介
PDF
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PPTX
仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発 - PyCon JP 2016
PDF
サーバーワークス re:invent_2016~新サービス・アップデート紹介~
PDF
20160927_守るべきは、大量の情報資産を管理するデータベース! ~ユーザ事例から見るデータベースのセキュリティ対策~ by 株式会社インサイトテクノ...
PPT
35歳でDBAになった私がデータベースを壊して学んだこと
PDF
20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫
PDF
地方エンジニアがPostgreSQLを通じて成長した話
PDF
[data analytics showcase] B16: Live Demo! データ分析基盤を支えるデータレプリケーション技術とデータワークロード分...
PDF
[CB16] 80時間でWebを一周:クロムミウムオートメーションによるスケーラブルなフィンガープリント by Isaac Dawson
Osc2015 hokkaido postgresql-semi-stuructured-datatype
レシピブログのサービス設計と今後の展望
Lagom で学ぶ Reactive Microservices Architecture @ 第3回Reactive System Meetup i...
今すぐ使えるクラウドとPostgreSQL
HAWQをCDHで動かしてみた
PostgreSQLアーキテクチャ入門
Ivsctonightandday2016winter moringsession awsreinvent2016recap
初心者がAWSでWebサービスを始めるまで 〜たった3ステップでWebページは公開できる〜
【自社プロダクト開発エンジニア募集中】エーピーコミュニケーションズ 先進開発グループ
[D31] PostgreSQLでスケールアウト構成を構築しよう by Yugo Nagata
最上級の簡易性を備えたオープンソースDBクラウド基盤 Composeのご紹介
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発 - PyCon JP 2016
サーバーワークス re:invent_2016~新サービス・アップデート紹介~
20160927_守るべきは、大量の情報資産を管理するデータベース! ~ユーザ事例から見るデータベースのセキュリティ対策~ by 株式会社インサイトテクノ...
35歳でDBAになった私がデータベースを壊して学んだこと
20160929_InnoDBの全文検索を使ってみた by 株式会社インサイトテクノロジー 中村範夫
地方エンジニアがPostgreSQLを通じて成長した話
[data analytics showcase] B16: Live Demo! データ分析基盤を支えるデータレプリケーション技術とデータワークロード分...
[CB16] 80時間でWebを一周:クロムミウムオートメーションによるスケーラブルなフィンガープリント by Isaac Dawson
Ad

Similar to Migr8.rb チュートリアル (20)

PDF
More Better Nested Set
PDF
Ansible入門
PDF
Cinnamon - simple deploy tool
PDF
Rails3.1rc4を試してみた
ODP
Ci tutorial
PDF
omoon.org の裏側 〜FuelPHP の task 活用例〜
PPTX
mysqlcasual6-fabric
PDF
OpenStack Grizzly構築手順書
PDF
Maatkitの紹介
KEY
Rails and twitter #twtr_hack
 
PDF
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
PDF
What's Temporal model FuelPHP東京勉強会03
PDF
2014/11/08 第3回 一撃サーバー構築シェルスクリプト勉強会(懇親会もあるよ!) 発表資料
PDF
どこよりも早い Spring Boot 1.2 解説 #渋谷Java
PDF
Mina 20130417
PPT
Ruby on Rails Tutorial Chapter8-10
PPTX
シラサギハンズオン 東京
PDF
ソーシャルゲーム案件におけるDB分割のPHP実装
KEY
Mojoliciousをウェブ制作現場で使ってみてる
PDF
Introduction to JShell: the Java REPL Tool #jjug_ccc #ccc_ab4
More Better Nested Set
Ansible入門
Cinnamon - simple deploy tool
Rails3.1rc4を試してみた
Ci tutorial
omoon.org の裏側 〜FuelPHP の task 活用例〜
mysqlcasual6-fabric
OpenStack Grizzly構築手順書
Maatkitの紹介
Rails and twitter #twtr_hack
 
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
What's Temporal model FuelPHP東京勉強会03
2014/11/08 第3回 一撃サーバー構築シェルスクリプト勉強会(懇親会もあるよ!) 発表資料
どこよりも早い Spring Boot 1.2 解説 #渋谷Java
Mina 20130417
Ruby on Rails Tutorial Chapter8-10
シラサギハンズオン 東京
ソーシャルゲーム案件におけるDB分割のPHP実装
Mojoliciousをウェブ制作現場で使ってみてる
Introduction to JShell: the Java REPL Tool #jjug_ccc #ccc_ab4

More from kwatch (20)

PDF
How to make the fastest Router in Python
PDF
なんでもID
PDF
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方
PDF
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
PDF
O/Rマッパーによるトラブルを未然に防ぐ
PDF
正規表現リテラルは本当に必要なのか?
PDF
【公開終了】Python4PHPer - PHPユーザのためのPython入門 (Python2.5)
PDF
PHPとJavaScriptにおけるオブジェクト指向を比較する
PDF
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
PDF
Fantastic DSL in Python
PDF
What is wrong on Test::More? / Test::Moreが抱える問題点とその解決策
PDF
PHP5.5新機能「ジェネレータ」初心者入門
PDF
Pretty Good Branch Strategy for Git/Mercurial
PDF
Oktest - a new style testing library for Python -
PDF
文字列結合のベンチマークをいろんな処理系でやってみた
PDF
I have something to say about the buzz word "From Java to Ruby"
PDF
Cより速いRubyプログラム
PDF
Javaより速いLL用テンプレートエンジン
PDF
Underlaying Technology of Modern O/R Mapper
PDF
How to Make Ruby CGI Script Faster - CGIを高速化する小手先テクニック -
How to make the fastest Router in Python
なんでもID
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
O/Rマッパーによるトラブルを未然に防ぐ
正規表現リテラルは本当に必要なのか?
【公開終了】Python4PHPer - PHPユーザのためのPython入門 (Python2.5)
PHPとJavaScriptにおけるオブジェクト指向を比較する
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
Fantastic DSL in Python
What is wrong on Test::More? / Test::Moreが抱える問題点とその解決策
PHP5.5新機能「ジェネレータ」初心者入門
Pretty Good Branch Strategy for Git/Mercurial
Oktest - a new style testing library for Python -
文字列結合のベンチマークをいろんな処理系でやってみた
I have something to say about the buzz word "From Java to Ruby"
Cより速いRubyプログラム
Javaより速いLL用テンプレートエンジン
Underlaying Technology of Modern O/R Mapper
How to Make Ruby CGI Script Faster - CGIを高速化する小手先テクニック -

Migr8.rb チュートリアル

  • 2.
  • 5. $ rails generate migration CreateUsers $ ls db/migrate/ 20131104023129_create_users.rb
  • 6. ## 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
  • 7. ## バージョンを上げる $ rake db:migrate ## バージョンを戻す $ rake db:rollback ## 再実行(戻して、もう一度上げる) $ rake db:migrate:redo ## 現在のバージョンを調べる $ rake db:version Current version:20131104023129
  • 8. 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) 

  • 12. ### 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"
  • 13. ### ヘルプを表示 $ ./migr8.rb help ### 初期化 $ ./migr8.rb init ### ディレクトリが作られる $ ls -F migr8/ history.txt # ← バージョン番号の一覧 migrations/ # ← マイグレーションファイル置き場
  • 14. $ ./migr8.rb new -m "create 'users' table" # or: ./migr8.rb new --table=users $ ls migr8/migrations scjs8350.yaml
  • 15. # -*- 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;
  • 16. # -*- 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};
  • 17. ### バージョンを上げる $ ./migr8.rb up ### バージョンを戻す $ ./migr8.rb down ### 再実行(戻して、もう一度上げる) $ ./migr8.rb redo ### 現在のバージョンを調べる
 $ ./migr8.rb status # 省略可 ...(snip)...
  • 18. 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) 

  • 19. ### インデックスを追加 $ ./migr8.rb new --index=users.name $ ./migr8.rb up ### テーブルを追加 $ ./migr8.rb new --table=groups $ ./migr8.rb up ### カラムを追加 $ ./migr8.rb new --column=users.group_id
  • 20. $ ./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' 

  • 21. $ 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
  • 23.
  • 24. # -*- 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};
  • 25. # -*- 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
  • 26. 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() );
  • 27.
  • 28. begin; create table ...; insert into _migr8_history ...; create index ...; insert into _migr8_history ...; alter table ...; insert into _migr8_history ...; commit;
  • 29. $ psql -qX -U user1 dbname < migr8/tmp.sql $ rm migr8/tmp.sql
  • 30. 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 ]--------------------------------------- ....
  • 31. up: | commit; alter type ... add value; begin;
  • 35.
  • 36. 
 
 # -*- 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
  • 39. 
 # -*- 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
  • 42. 
 
 $ ./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
  • 44.
  • 45. 
 
 $ ./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
  • 52. $ ./migr8.rb readme ## readmeを表示 $ ./migr8.rb help ## ヘルプ $ ./migr8.rb init ## 初期化
  • 53. $ ./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 ## 一意制約を追加
  • 54. $ ./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) 未適用のものを古い順に全部適用
  • 55. $ ./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) 適用済のものを新しい順に全部戻す
  • 56. $ ./migr8.rb redo -h ## ヘルプ $ ./migr8.rb redo ## 1つだけ戻し、再度適用する $ ./migr8.rb redo -n 3 ## 3つ戻し、再度適用する $ ./migr8.rb redo --ALL ## 全部戻し、再度適用する
  • 57. $ ./migr8.rb apply -h ## ヘルプ $ ./migr8.rb apply version ## 指定したのを適用 $ ./migr8.rb apply version1 version2 ... ## 複数指定も可
  • 58. $ ./migr8.rb unapply -h ## ヘルプ $ ./migr8.rb unapply version ## 指定したのを適用 $ ./migr8.rb unapply version1 version2 ... ## 複数指定も可 $ ./migr8.rb unapply -x version ## ファイルがない場合(※) (※) unapply -x は、マイグレーションファイルを使わず、 DB内の履歴テーブルに格納された down 用 SQL を使う。 「適用されているけどファイルがないマイグレーション」を 戻すときはこの方法を使う。
  • 59. $ ./migr8.rb show -h ## ヘルプ $ ./migr8.rb show version ## 内容を表示 (変数展開済) $ ./migr8.rb show ## 直近のバージョンが対象 $ ./migr8.rb show -x version ## DBテーブルから読み込む
  • 60. $ ./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 で指定される
  • 61. $ ./migr8.rb delete -h ## ヘルプ $ ./migr8.rb delete --Imsure version ## ファイルを削除(※) $ ./migr8.rb delete version ## (これは動作しない) (※) マイグレーションが適用済みならファイルは削除できない。
  • 62. $ ./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
  • 63. $ ./migr8.rb hist -h ## ヘルプ $ ./migr8.rb hist ## 履歴を表示 $ ./migr8.rb hist -o ## history.txtをエディタで開く $ ./migr8.rb hist -b ## 順番を保ったまま、
 ## history.txtを作り直す(※) (※) マイグレーションファイル内の摘要(description)と、 history.txt 内のコメントとが一致していないときに使う。