Brewfileとbrew-caskとを使ってのMacのセットアップ

Macの初期セットアップをするにはBoxen使うよりもBrewfileとHomebrew-cask使うのが良いかと思います。

現時点ではこの方法が一番だと個人的には思っております。

BrewfileとHomebrew-caskについての記事はいろいろな方が書かれているので詳細はそちらを参照して下さい。

Boxenはなぜダメなのか?

Boxenが全然イケてないよという訳ではありません。上で上げた記事でもみなさん述べているのですが、Boxenは大掛かりすぎるのですよね。最初はBoxen使えば個人的にMac買い替えた時に便利だなーとか、みんなの環境揃えられるかなーと思ってちょっと調べていたのですがいろいろ面倒くさい。

あと、なんやかんやでPuppet覚えないといけないのもちょっと。Boxen触り始めて初めてPuppetを触り始めたのですが最初ちょっと辛かった。まあ慣れてしまえばどうってことないのですが。この最初の敷居がチーム内に浸透させにくそうだと感じました。

そして一番の原因が自分の環境がイマイチよく分からなくなること。Boxenの動きをきちんと理解すれば問題ないのでしょうが、rbenvとかもろもろ勝手に入れられてしまうのでなにがどこにあるのか私的には分からなくなりました。

そんなこともあり、結局仮想マシン上のOS Xでいろいろと試行錯誤しましたが結局使うことをやめました。

(ここが結構大事なところで私はチキンなのでいきなりローカル環境で試す気にはなりませんでした。安全策をとってこの方法仮想マシン上で実験しました。結果、これで良かったと心から思っております。)

Brewfile

HomebrewはMacで開発している方ならほとんど使っているはずです。(MacPortsを使っている人もいるかと思いますが。。。)。なのでbrewの延長線上で環境を管理できるので違和感なく導入できるのが最大のメリットだと思います。

そして非常にシンプル。Brewfileを用意してそこにインストールしたいものを記述しておけば、brew bundleコマンド一発でセットアップができます。

しかもこのコマンドをたたいた時に、既にインストールされているものは「既にインストールされています」とスキップしてくれます。これ地味に便利。

Homebrew-cask

brewだけでできることはあくまでもbrewに登録されているパッケージを管理することだけです。そこでbrew-caskが必要になってきます。これを使うとdmgやpkg形式の普通のアプリケーションもインストールできるのです。素晴らしい。

私が普段使っているアプリは全てcaskのリポジトリに登録されていたので全く問題なかったです。もし自分が使っているアプリが登録されていなくても簡単なRubyのコードを書いてあげればOKなので拡張性も高いです。

まあアプリケーションのインストールはBoxenでもできるのですが、何度も言うように Brewの延長上でできる ということが最大の肝だと思います。

補足

インストール方法についてはここでは特に触れません。それぞれのドキュメント読むなり、冒頭であげた方々の記事を読めば詳しくのっております。

一応、各ツールのリンクだけ張っておきます。

まとめ

私のBrewfileはdotfilesの一部としてあげておきました。

こうしておけば以前書いた記事のようにhomesickを使って、いつでもどこでも自分の環境を作りなおすことが可能です。

チーム開発を行う場合はチームでのdotfilesを用意しておけば良いだけです。

すごいべた褒めな感じでBrewfileとHomebrew-caskを紹介しましたが不満点が無いわけではありません。

以下に今のところの私の不満点をあげておきます。もしかしたら何かしら方法があるかもしれないので「それできるよ!」というものがあったら@braitomまで教えていただけると助かります。

  • OS Xの設定ができない

    • BoxenではDockを左側にするとかそういったOS Xに関する設定ができました。brew-caskだとこれができません。
  • App Storeのアプリはインストールできない

    • これは致し方無いきもしますが、AppStoreの履歴からポチポチするのがダルいです。
  • brew-caskでインストールするものの中にはたまにpassword入力が必要なことがある

    • 私の場合、Google日本語入力がpasswordの入力が必要で途中で処理が止まっていました
  • コマンド実行が必要なものをいれられない

    • 私の場合、nodeのバージョン管理にはnodebrewを使っています。 こいつはperlコマンドをたたいてあげる必要があるのですがこれができる方法が無いです。あとoh-my-zshもこの理由により入れることができません。

この辺を解決できる手段があればまさに最強のツールになるのですが、たいした手間でも無いので私的には全然許容範囲です。

Xcodeおすすめプラグイン

今のところ使っていて便利なXcodeプラグインをつらつらと記録しておきます。

今後いいものを見つけたら更新していく予定。

Xcodeプラグインのインストール方法

  • 基本的にはgithub等に上がっているソースコードを落としてきてローカルでビルドすれば勝手に入ってくれます。

  • アンインストールするときは基本、   

~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins

に入っている.xcpluginファイルを消せばOK。

現在使っているプラグイン

最後に

とりあえずまだこれくらいしか使っていません。   

いいプラグインがあればぜひ教えて下さい!! 

Macのdotfilesをhomesickで管理する

扱うMacの台数が増えてきたので、そろそろ本気でdotfiles(.zshrcとか.vimrcとか)を管理してみることにしました。

単にGithubでdotfilesを管理するだけでもいいのですが、調べてみるとhomesickというgemを使うのが今はイケてるっぽい。

1. homesickを入れる 

とりあえずhomesickを入れます。

$ gem install homesick

rbenv使っている場合はrbenv rehashを忘れずに。(私はいつも忘れます。はい。)

2. GitHubにdotfilesリポジトリを作る

Web上から空のリポジトリを作っておいてもいいし、brewhub入れてるならhubコマンドで作ってもいいです。

そしたら、ローカルの適当な場所に、dotfilesという名前でディレクトリを作成します。ここでgit initしておきます。

$ mkdir ~/dotfiles && cd ~/dotfiles

$ git init

さらにdotfilesの下にhomeという名前でディレクトリを作成します。そしたらこの中に、管理したいdotfile達をコピーしていきます。

$ mkdir home && cd home

$ cp ~/.zshrc .

$ cp ~/.vimrc .

$ cp ~/.tmux.conf .

管理したいファイルをすべてコピーしたらgit add .してからコミットしましょう。あとは先ほど作ったリポジトリにpushすればOKです。

(Gitの使い方とかGitHubへのpush方法は割愛します。)

3. homesickを使う

では早速homesickを使っていきましょう。

homesick cloneコマンドでdotfilesをhomesickの管理下に置けます。引数に、[GitHubのユーザ名]/[リポジトリ名]を渡すといい感じにcloneしてくれます。

私の場合は以下の様なコマンドとなります。

$ homesick clone braitom/dotfiles

そうすると以下の場所にcloneされます。

~/.homesick/repos/dotfiles

これで準備は整いました。後は実際に使う場所からsimlinkをはります。

私の場合はhomeで使いたいので以下の様な感じとなります。

$ cd ~

$ homesick symlink dotfiles

そうすると自動で~/.homesick/repos/dotfiles/homeフォルダの下にある全部のファイルにsymlinkが貼られます。

なお、ファイルが既にある場合は上書きするかどうか聞いてきます。以前のファイルを念のためバックアップしておきたい方はバックアップしておくことを忘れずに。

念のためls -laできちんとsymlinkが貼られているか確認しておくことをお勧めします。

これ以降は~/.homesick/repos/dotfiles/をGitで管理していくことになるので、この時点で手順2で最初に作成した dotfilesデレクトリは消してしまってOKです。

なお、homesickでcloneするとremote.origin.urlがhttpsになっているのでsshに変更しておきましょう。特にGitHubに2段階認証を設定している場合は面倒なので変更しておくことをお勧めします。

$ git config remote.origin.url git@github.com:braitom/dotfiles.git

GitHubssh設定が分からない方は以下に手順が書いてありますので参考に。

ちなみにhomesick listでcloneしているリポジトリが分かります。

$ homesick list

   dotfiles  git@github.com:braitom/dotfiles.git

あとは、~/.homesick/repos/dotfiles/homeのdotfile達を変更、追加する場合は通常のGitリポジトリとして管理していけばOKです。

ファイルを変更した場合は、

$ homesick commit dotfiles

#vimが開くのでコミットメッセージを入れて保存

$ homesick push dotfiles

これでコミットされてpushされます。

ファイルを追加した場合は、homesick addみたいなコマンドがないようなので、

$ cd ~/.homesick/repos/dotfiles

$ git add .

して、あとは変更時と同じようにコミットしてpushすればOKです。

3. 違うMacでhomesickを使ってdotfilesを同期する

だいたい分かるかと思いますが一応書いておきます。細かいことは上で書いた手順と同じなので割愛します。

  • homesickのインストール
$ gem install homesick
$ homesick clone braitom/dotfiles
  • symlinkをはる
$ homesick symlink dotfiles

4. 運用方法

これであとはどのMacでもdotfilesの追加、更新をhomesick経由で管理していけばOKです。

違うMacで変更した設定を反映させるには以下のコマンドで。

$ homesick pull dotfiles

5. まとめ

このようにお手軽にdotfilesをGithub上で管理できるようになります。

いやーhomesick便利ですねー。

ちなみに私のdotfilesは以下にありますので興味がある方はご覧く下さい。各ファイルともまだまだまだ貧弱なのでアドバイスとかいただけると嬉しいです。

Macにoh-my-zsh導入

今までbashで別にいいやって感じでずっとbashを使い続けていましたが、どうもzshを使っていないと時代遅れ感がだいぶ出てきたのでzshを使うことにしました。

いろいろ設定するのめんどくさいなーとか思っていたらoh-my-zshを使うのがナウな感じなようです。

確かに基本的な設定は全部入っているし、プラグインの仕組みとかあるので便利そう。

Macにはデフォルトでzshが入ってますがbrewで入れたものを使うようにしたいと思います。

とりあえずbrewで最新版入れておきます。

Maczsh は起動時に PATH をリセットしてしまうそうなのでオプションつけてインストールしておきます。

※参考:Macでhomebrewのzshを使う

$ brew install --disable-etcdir zsh

ここでoh-my-zshを入れましょう。

公式の通りcurlを叩きましょう。

curl -L https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh | sh

途中でデフォルトのシェルをzshにするか聞いてくるのでパスワードを入れましょう。

ここでchpassコマンドを叩いてみましょう。

こんな感じで、brewでいれたzshがデフォルトのshellになっているはずです。

##

Shell: /usr/local/bin/zsh

Full Name: braitom

Office Location:

Office Phone:

Home Phone:

あとは自分の好きなテーマを適用したり、プラグインを適用したりして手に馴染むように育てていきましょう。

ちなみに私は今のところ”3den”というテーマがお気に入りです。 こんな感じ。

1__braitom_braitom-retina_____zsh__と_Roon_—_Editor

なお、以下のサイトを参考にさせていただきました。

Mac OS X で zsh + oh-my-zsh の環境を作って一通り設定するまで

良いテーマや、プラグインがあったら随時紹介していきたいと思います。

テーマは以下のページを見ると確認できます。

とりあえず今回は導入までということで。

追記

おすすめのテーマ"3den"としていましたが、なぜかrvmに依存しているようでいちいちrvmが見つからないと言ってくるのでうっとおしいのでやめました。

という訳で現在のおすすめのテーマは"wedisagree"です。gitリポジトリの場合そのステータスをグラフィカルに表示してくれます。あら便利。

詳しくはこちらで解説してくれています。

iOSで実機にアプリを転送してテストする方法

最近周りでiOSアプリの開発に手を出す方々が増えてきたので自分の備忘録も兼ねてまとめておきます。

今更感が若干ありますが。。。

注意点

  • ブラウザで行う作業はすべてSafariで行った方が無難です。Safari以外だと証明書の発行等がうまく動かずコケる可能性があります。

  • この記事は2013年12月現在のものです。今後若干手順が変わる可能性があります。

環境

今回は以下の環境で作業を行っています。

実機転送方法手順

全体としては以下の様な流れになります。

  1. iOS Developer Programへの登録

  2. Apple Developer Centerへログイン

  3. 証明書の作成

  4. CSRファイルの作成

  5. CSRファイルのアップロード

  6. 生成された証明書のダウンロード

  7. テスト端末の登録

  8. テストアプリのApp ID登録

  9. プロビジョニングファイルの作成

  10. Xcodeへの設定

  11. 実機への転送

それでは手順を説明していきます。

1. iOS Developer Programへの登録

ここでは細かい登録方法は省きます。(参考になる情報が山ほどあるので。)

以下の記事が参考になるかと思います。こちらを参考にして登録しましょう。

※個人的には普段使うAppleIDと開発用のAppleIDは分けることをお勧めします。iOS Developer Program登録の際は全て英語で記入しないとうまくいきません。一方で、iTunesでの購入などでは日本語設定であることが必要です。そのためIDを分けて管理した方が良いです。

どうしても登録できずにはまった場合はAppleのサポートセンターに電話しましょう。日本の番号にかければ日本語で対応してくれます。

※ちなみに私は自分の開発用のアカウントを忘れてしまいサポートの方に大変ご迷惑をお掛けしてしまいました。。。そして、サポートセンターの方の親切さに感動しました。

2. Apple Developer Centerへログイン

Apple Developer Centerへログインします。

上のメニューからメンバーセンターをクリックします。

image

3 証明書の作成

メンバーセンターに入るとこのような画面になるので「Certificates,Identifiers & Profiles」をクリックする。

image

次に「iOS Apps」の「Certificates」をクリックする。

image

そうすると、こんな画面になります。何もまだ証明書が無いときはこんな感じで表示されます。既に色々と作成してある場合は一覧がでます。右上の「+」ボタンを押します。

image

必要な証明書の種類を選択してContinueボタンを押します。今回は実機でのデバッグを行いたいので「iOS App Development」を選択します。

image

そうすると、このような画面が出ます。ここの説明にあるようにCSRファイルを作成します。

image

4. CSRファイルの作成

さて、ここからはローカルのMac上で作業を行うことになります。

キーチェーンアクセスを開きます。(アプリケーション>ユーティリティの中にあります。)

メニューから、キーチェーンアクセス>証明書アシスタント>認証局に証明書を要求..と開き、以下のように値を入力、選択します。

imageimage

続けるを押すと、保存場所を聞かれるので、任意の場所を選択します。

その後、以下の画面となりますが、デフォルトのままで、続けるを押します。

image

そうすると以下の画面が表示され、先ほど指定した保存先に、「CertificateSigningRequest.certSigningRequest」というファイルができているはずです。

image

image

5. CSRファイルのアップロード

再びブラウザに戻ります。

CSRファイルをアップロードするように言われるので、先ほど作成して保存した「CertificateSigningRequest.certSigningRequest」を指定します。

image

指定したら、Generateボタンを押します。

image

6. 生成された証明書のダウンロード

こんなかんじで証明書をダウンロードできるようになるので、こいつをダウンロードします。

image

ダウンロードした証明書(.cer)をダブルクリックするとキーチェーンに登録されます。キーチェーンを開いて確認してみて下さい。以下のように登録されているはずです。

image

7. テスト端末の登録

ここまで来たらやっとデバイスの登録です。

Xcodeを開いてOrganizerを開きます。(Xcodeメニューから、Window > Organizer)

画面上の「Identifier」をコピーします。

image

ここからまたブラウザ上での作業になります。Developer Centerで今度はDevicesをクリックします。

image

こんな画面になると思うので右上の「+」ボタンを押します。

image

以下のような画面になるので項目を入力して「Continue」をクリックします。

image

確認画面が出るので問題なかったら「Register」をクリックします。

image

完了画面が出たらOKです。

再度一覧を見ると先ほど登録したデバイスが表示されているかと思います。

image

他にもデバイスを追加したい場合は「+」を押して同じ手順でデバイスを追加していって下さい。

8. テストアプリのApp ID登録

Developer Centerで今度はIdentifiersを選択してApp IDを登録します。例のごとく右上の「+」ボタンをクリックして下さい。

image

以下のような画面が出るので必要な情報を登録します。私は以下のように設定しています。

image

ポイントは、

  • 「App ID Description」は任意の名前でOKです。普通はアプリケーションごとに作ったほうが良いです。私の場合ズボラなのでbraitomDevという名前にして開発用には使い回してます。

  • 「App ID Prefix」は個人の場合はデフォルトのまま変更できません。企業でチーム作っている場合は何か設定できるはず。

  • 「App ID Suffix」は「Explicit App ID」と「Wildcard App ID」の2種類ありますが、他のアプリと被らないようにどちらかだけ入力すればOKです。公開予定の明確なアプリの場合は「Explicit App ID」を使うほうが良いかと思います。テスト用でとりあえずの場合は「Wildcard App ID」で良いかと思います。私の場合は「jp.co.braitom.*」としてしまっています。

  • 「App Services」の部分はPushなど何か使いたいサービスがあればチェックを入れます。

これで「Continue」ボタンを押すと確認画面がでるので、「Submit」ボタンを押せば登録完了です。

image

9. プロビジョニングファイルの作成

次にプロビジョニングファイルを作成します。いろいろ作るものがあってそろそろダルくなってきたと思いますがこれで最後です。頑張りましょう。

例のごとく今度は、「Provisioning Profiles」を選択して、右上の「+」ボタンを押します。

image

開発用に使いたいので、「Decelopment」の「iOS App Development」を選択して「Continue」をクリックします。

image

App IDを選択して、「Continue」をクリックします。

image

作成した証明書にチェックを入れて、「Continue」をクリックします。

image

デバイスにチェックを入れて、「Continue」をクリックします。(複数デバイスの場合は複数チェックできます)

image

Profile Nameは任意でOKです。入力したら「Generate」をクリックします。

image

生成されたプロビジョニングファイルをダウンロードします。

image

ここで、実機をMacに接続しておきましょう。

ダウンロードしたプロビジョニングファイルをダブルクリックするとXcodeのOrganizerに追加されていることが確認できます。StatusがちゃんとValid profileになっていればOKです。

image

10. Xcodeへの設定

さあ、ここまで来ればもう少しです。頑張りましょう!

Xcodeでプロジェクトを開きます。以下の手順でプロビジョニングファイルを設定します。

  1. プロジェクトをクリックします。

  2. Build Settingsを選択します。

  3. Allを選択します。

  4. Code Signingの各項目に先ほど作成した証明書、プロビジョニングファイルを選択します。

image

11. 実機への転送

さあ、いよいよ実機への転送です。実機をMacに接続しましょう。

Xcode上の以下の部分をクリックして、接続している実機を選択しましょう。ここではiPhone5Sを選択しています。

image

image

これでいよいよ実行です、XcodeでRunしましょう。▶ボタンを押せばOKです。

最初はもしかしたらこんな画面がでるかもしれませんがEnableを押して、パスワードを入力すればOKです。

image

こんな感じで無事に実機上で動作させることができました!

image

image

以上、めでたしめでたし。

おまけ: 他のMacでも実機デバッグしたい場合

Apple大好きのエンジニアの皆様はもちろんMac複数台持っていますよね?そんな時にはメインのMacから証明書を書き出してそれを使うということができます。

1. 証明書の書き出し

最初に登録したMacでキーチェーンを開いて自分の証明書を表示します。

先ほど登録した証明書があると思うので、その証明書の三角アイコンをクリックします。

そうすると自分で付けた名前が見つかりますのでこれを右クリックし、「"【秘密鍵名】"を書き出す…」を選択します。

image

そうすると保存場所等を聞かれます。名前、場所はとりあえず適当でOKです。フォーマットは「個人情報交換(.p12)」を選択してくだい。

保存するときにパスワードの設定を求められたり、管理者のパスワードを求められるので設定、入力して下さい。

これで書き出しは完了です。

2. 証明書の登録

ここからは別のMacでの作業となります。

先ほど書きだした証明書を別のMacに送って下さい。そして証明書をダブルクリックします。

そうするとキーチェーンが開いて以下の様な画面が出ます。そのまま追加をクリックします。

image

その後、設定したパスワードの入力を求められるので設定します。

無事に登録されるとキーチェーンの自分の証明書のところにPhone Developerの証明書が追加されているかと思います。

image

3. 実機への転送

Xcodeを開いてOrganizerを開いてみましょう。以下の様に、問題なくプロビジョニングファイルが読み込まれるはずです。問題なくStatuteが緑色になってますね。

image

あとは同じ手順でXcodeから実行すればOKです。

まとめ

手順的には面倒くさいですが、一度やり方が分かってしまえば何てことはないです。ただし、しばらくするとすぐ忘れます。。。

リリース時の手順はやったことが無いので、機会があればまとめようかと思います。

Mac上にMacの仮想マシンをたてる

その名の通りです。

何がしたいんだって話はありますが、ちょっとした検証したい時にいつも使っているMacの環境を汚したくないときなどに非常に便利です。

自分の場合は、Boxenの検証環境として使うのが主な目的です。

基本的には以下を参考にすればOKです。 非常に助かりました。

2つ目の記事にもかいてあるように、SOFTWARE LICENSE AGREEMENT FOR OS X MAVERICKS を見ると、

(iii) to install, use and run up to two (2) additional copies or instances of the Apple Software within virtual operating system environments on each Mac Computer you own or control that is already running the Apple Software, for purposes of: (a) software development; (b) testing during software development; (c) using OS X Server; or (d) personal, non-commercial use

と書いてあるので、非商用目的での開発検証用ならば、1つのMac上に2つ仮想マシンを動かしてもOKみたい。なのでライセンス違反にはならないはず。

gemをたたく必要があるのですがMacならもともとRubyが入っているので大丈夫でしょう。

ちなみにこれらの記事はVirtualBox上で動かしていますが、VMWare Fusion 6でも作成したdmgを使えば仮想マシンとして動作させることができました。

こんな感じ。便利ですね!

スクリーンショット 2013-12-09 0,16,35

##追記 ちなみにホストOSはMavericks(OSX 10.9)で試しています。

SqlAlchemy-migrateを使ってみる

SqlAlchemy-migrateを使ってみる

概要

RailsActiveRecordのMigrationに影響を受けて、SQLAlchemy を使ったプロジェクトのスキーマ管理をできるようにしたもの。

現時点での最新Verは0.8.2みたいです。

Package Index > sqlalchemy-migrate > 0.8.2

使用方法

ライブラリのインストール

$ pip install sqlalchemy
$ pip install sqlalchemy-migrate

これにより"migrate"コマンドが使えるようになる。

$ migrate --help

プロジェクトの作成

※DBは既に存在していることを前提とする。今回はチュートリアルにのっとりSQLiteを使用します。

ちなみに初期Tableはこんな感じで作ってある。

# create_table.py

from sqlalchemy import *

engine = create_engine('sqlite:///test.db', echo=True)

meta = MetaData()

city = Table('city', meta,
             Column('city_id', INTEGER, primary_key=True),
             Column('city_name', String(32)))

meta.create_all(engine)

まずはプロジェクトを作る。

$ migrate create test_migrate "Test Project"
$ tree
.
└── test_migrate
├── README
├── __init__.py
├── __init__.pyc
├── manage.py
├── migrate.cfg
└── versions
    ├── __init__.py
    └── __init__.pyc

データベースの初期化

$ cd test_migrate/
$ python manage.py version_control sqlite:///test.db .

毎回、データベース情報引数で渡すのはめんどいので登録しておく。

$ migrate manage manage.py --repository=. --url=sqlite:///test.db

DB見るとマイグレーション用のTableができてる。

$ sqlite3 test.db
$ .explain ON
$ .tables
city             migrate_version


sqlite> select * from city;
city  city_name
----  -------------
1     Los Angels
2     San Francisco

sqlite> select * from migrate_version;
repo  repository_pa  vers
----  -------------  ----
Test Project  .       0

現在のスキーマバージョン。

$ python manage.py db_version
  0

登録されているスキーマバージョンの確認。

$ python manage.py version
  0

スキーマ変更用のスクリプトの作成

まずは、スキーマ変更用のスクリプトを登録する。

$ python manage.py script "Add country table"
$ cd versions/
  001_Add_country_table.py  __init__.py  __init__.pyc

001_Add_country_table.pyを書き換える。

# 001_Add_country_table.py

from sqlalchemy import *
from migrate import *

meta = MetaData()

country = Table('country', meta,
                Column('id', Integer, primary_key=True),
                Column('country_name', String(32))
                )


def upgrade(migrate_engine):
    meta.bind = migrate_engine
    country.create()


def downgrade(migrate_engine):
    meta.bind = migrate_engine
    country.drop()

ちゃんと動くかテストする。

$ python manage.py test
  Upgrading...
  done
  Downgrading...
  done
  Success

現在のスキーマバージョン、登録されているスキーマバージョンを確認してみる。 versionが1上がってますね。

$ python manage.py db_version
  0
$ python manage.py version
  1

スキーマを上げる

$ python manage.py upgrade
  0 -> 1...
  done

バージョンが上がっているか確認。

$ python manage.py db_version
  1

sqliteの中身みてみる。countryが追加されてる。

 sqlite> .tables
    city             country          migrate_version
    sqlite> .schema country
    CREATE TABLE country (
        id INTEGER NOT NULL,
        country_name VARCHAR(32),
        PRIMARY KEY (id)
    );

ダウングレードしてみる

できてますね。(countoryが消えてる。)

$ python manage.py downgrade 0
  1 -> 0...
  done

sqlite> .tables
city             migrate_version

元に戻してみてもOK。

$ python manage.py upgrade
  0 -> 1...
  done

sqlite> .tables
city             country          migrate_version

カラムの追加

countryテーブルにpopulationカラムを追加してみる。 スクリプトが追加されてますね。

$ python manage.py script "Add population column in country table"
$ ls versions/
001_Add_country_table.py            __init__.py
001_Add_country_table.pyc           __init__.pyc
002_Add_population_column_in_country_table.py

002_Add_population_column_in_country_table.pyを書き換えてみる。

# 002_Add_population_column_in_country_table.py

from sqlalchemy import *
from migrate import *


def upgrade(migrate_engine):
    meta = MetaData(bind=migrate_engine)
    country = Table('country', meta, autoload=True)
    population_col = Column('population', Integer)
    population_col.create(country)


def downgrade(migrate_engine):
    meta = MetaData(bind=migrate_engine)
    country = Table('country', meta, autoload=True)
    country.c.population.drop()

テストしてみる。いけそう。

$ python manage.py test
  Upgrading...
  done
  Downgrading...
  done
  Success

現在のスキーマバージョン、登録されているスキーマバージョンを確認してみる。

$ python manage.py db_version
  1
$ python manage.py version
  2

アップデートしてみる。populationカラムが追加されてますね。

$ python manage.py upgrade
1 -> 2...
done

sqlite> .schema country
CREATE TABLE country (
    id INTEGER NOT NULL,
    country_name VARCHAR(32), population INTEGER,
    PRIMARY KEY (id)
);

現在のスキーマバージョン、登録されているスキーマバージョンを確認してみる。

$ python manage.py db_version
  2
$ python manage.py version
  2

複数バージョン間の移動

もちろんver2からver0、ver0からver2とかもできる。

$ python manage.py downgrade 0
2 -> 1...
done
1 -> 0...
done

$ python manage.py upgrade 2
0 -> 1...
done
1 -> 2...
done

まとめ

SqlAlchemy-migrate非常に便利ですね。Flaskとかとも組み合わせて使ってみたい。