SlideShare a Scribd company logo
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スキーマもバージョン管理したい!
kwatch
 
PPTX
PostgreSQL共有バッファと関連ツール
Masahiko Sawada
 
PDF
If文から機械学習への道
nishio
 
PDF
新入社員のための大規模ゲーム開発入門 サーバサイド編
infinite_loop
 
PPTX
SQLチューニング入門 入門編
Miki Shimogai
 
PDF
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
 
PPTX
PostgreSQL 14 モニタリング新機能紹介(PostgreSQL カンファレンス #24、2021/06/08)
NTT DATA Technology & Innovation
 
PPTX
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
Miki Shimogai
 
DBスキーマもバージョン管理したい!
kwatch
 
PostgreSQL共有バッファと関連ツール
Masahiko Sawada
 
If文から機械学習への道
nishio
 
新入社員のための大規模ゲーム開発入門 サーバサイド編
infinite_loop
 
SQLチューニング入門 入門編
Miki Shimogai
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
 
PostgreSQL 14 モニタリング新機能紹介(PostgreSQL カンファレンス #24、2021/06/08)
NTT DATA Technology & Innovation
 
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
Miki Shimogai
 

What's hot (20)

PPTX
backlogsでもCI/CDする夢を見る
Takeru Maehara
 
PDF
InnoDBのすゝめ(仮)
Takanori Sejima
 
PDF
エンジニアから飛んでくるマサカリを受け止める心得
Reimi Kuramochi Chiba
 
PDF
レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
Marp Tutorial
Rui Watanabe
 
PDF
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
 
PDF
データベース設計徹底指南
Mikiya Okuno
 
ODP
SPAのルーティングの話
ushiboy
 
PPTX
エラーハンドリング
道化師 堂華
 
PPTX
やってはいけない空振りDelete
Yu Yamada
 
PDF
webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話
Yuhei Miyazato
 
PDF
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
NTT DATA Technology & Innovation
 
PDF
3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)
Kuniyasu Suzaki
 
PDF
TEE (Trusted Execution Environment)は第二の仮想化技術になるか?
Kuniyasu Suzaki
 
PDF
Rust で RTOS を考える
ryuz88
 
PDF
できる!並列・並行プログラミング
Preferred Networks
 
PDF
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)
NTT DATA Technology & Innovation
 
PDF
PostgreSQL Unconference #29 Unicode IVS
Noriyoshi Shinoda
 
PDF
O/Rマッパーによるトラブルを未然に防ぐ
kwatch
 
PDF
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
backlogsでもCI/CDする夢を見る
Takeru Maehara
 
InnoDBのすゝめ(仮)
Takanori Sejima
 
エンジニアから飛んでくるマサカリを受け止める心得
Reimi Kuramochi Chiba
 
レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
Marp Tutorial
Rui Watanabe
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
 
データベース設計徹底指南
Mikiya Okuno
 
SPAのルーティングの話
ushiboy
 
エラーハンドリング
道化師 堂華
 
やってはいけない空振りDelete
Yu Yamada
 
webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話
Yuhei Miyazato
 
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
NTT DATA Technology & Innovation
 
3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)
Kuniyasu Suzaki
 
TEE (Trusted Execution Environment)は第二の仮想化技術になるか?
Kuniyasu Suzaki
 
Rust で RTOS を考える
ryuz88
 
できる!並列・並行プログラミング
Preferred Networks
 
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)
NTT DATA Technology & Innovation
 
PostgreSQL Unconference #29 Unicode IVS
Noriyoshi Shinoda
 
O/Rマッパーによるトラブルを未然に防ぐ
kwatch
 
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
Ad

Viewers also liked (20)

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

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

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

More from kwatch (20)

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

Recently uploaded (11)

PDF
第三世代 ウェザーステーションキット v3 ー WSC3-L 日本語カタログ
CRI Japan, Inc.
 
PDF
20250729_Devin-for-Enterprise
Masaki Yamakawa
 
PPTX
baserCMS『カスタムコンテンツ』徹底活用術〜あなただけの管理画面を自由自在に〜
Ryuji Egashira
 
PDF
【学会聴講報告】CVPR2025からみるVision最先端トレンド / CVPR2025 report
Sony - Neural Network Libraries
 
PDF
LoRaWAN ウェザーステーションキット v3 -WSC3-L 日本語ユーザーマニュアル
CRI Japan, Inc.
 
PPTX
2025_7_25_吉祥寺_設計ナイト_ADR運用におけるデータ利活用の考え方.pptx
ssuserfcafd1
 
PDF
VMUG Japan book vsan 20250515 CPU/Memory vSAN
Kazuhiro Sota
 
PDF
20250726_Devinで変えるエンプラシステム開発の未来
Masaki Yamakawa
 
PDF
MahiroYoshida_セリフに着目したキャラクタロール推定に関する基礎検討_sigcc12th2025
Matsushita Laboratory
 
PDF
20250730_QiitaBash_LT登壇資料_PDC_Kurashina.pdf
pdckurashina
 
PDF
TaketoFujikawa_ComicComputing12th_inKumamoto
Matsushita Laboratory
 
第三世代 ウェザーステーションキット v3 ー WSC3-L 日本語カタログ
CRI Japan, Inc.
 
20250729_Devin-for-Enterprise
Masaki Yamakawa
 
baserCMS『カスタムコンテンツ』徹底活用術〜あなただけの管理画面を自由自在に〜
Ryuji Egashira
 
【学会聴講報告】CVPR2025からみるVision最先端トレンド / CVPR2025 report
Sony - Neural Network Libraries
 
LoRaWAN ウェザーステーションキット v3 -WSC3-L 日本語ユーザーマニュアル
CRI Japan, Inc.
 
2025_7_25_吉祥寺_設計ナイト_ADR運用におけるデータ利活用の考え方.pptx
ssuserfcafd1
 
VMUG Japan book vsan 20250515 CPU/Memory vSAN
Kazuhiro Sota
 
20250726_Devinで変えるエンプラシステム開発の未来
Masaki Yamakawa
 
MahiroYoshida_セリフに着目したキャラクタロール推定に関する基礎検討_sigcc12th2025
Matsushita Laboratory
 
20250730_QiitaBash_LT登壇資料_PDC_Kurashina.pdf
pdckurashina
 
TaketoFujikawa_ComicComputing12th_inKumamoto
Matsushita Laboratory
 

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 内のコメントとが一致していないときに使う。