2015/2/21に開かれた、めとべや東京 #7 でのLTスライドです。
FluentMigratorでDBマイグレーション@thinkAmiめとべや東京 #7 2015.2.21
View Slide
自己紹介• 長野県から来ました• アカウント– thinkAmi• Twitter• Hatena• GitHub• C#(WPF)とかMS AccessとかRubyとか
自己紹介• りんご食べあるき– 現在57種類くらい• 今日はピンクレディを食べました• Twitter + Heroku + C#(Ruby)で記録・公開» http://ringo-tabetter-cs.herokuapp.com/
長野県のコミュニティ• NSEG (#nseg)– 長野県とコンピューターをテーマに毎月開催• 本日、ギークラボ長野でOpenDataハッカソン中• Google Developer Group 信州• 3/14 AndroidWearイベント» IT勉強会スタンプラリー参加• Azure しなの (3/28 Hokuriku.NETと合同勉強会)• JAWS-UG 長野支部» 他のコミュニティ > https://github.com/nseg-jp/w/wiki/NSEG以外の長野のIT勉強会
本題• FluentMigratorでDBマイグレーション• クライアントアプリの裏側ということで...
定義• DBマイグレーションとは– DBのテーブルスキーマの更新などを管理・実行できるようにすること– 他にもありますが、今回は上記の定義です
本題• データベースの管理にて– 最初のうち• CUIでDDLやDMLを実行• GUIでポチポチ– 次第に忘れ去られ...• どの順番でどのDDLやDMLを実行する?• 何でこんなスキーマにしたんだっけ?» ツライ– DBマイグレーションをしたい...
Entity Framework• Code First Migrations– MS Accessで試したが使えず...• EFがOLEDB接続をサポートしていないため» http://stackoverflow.com/a/11197393
FluentMigrator• DBマイグレーションフレームワーク– C#で、DDLやDMLを書く• DBに依存せず、スキーマの変更を記述可能• Gitなどで、バージョン管理可能• リポジトリ(GitHub)– https://github.com/schambers/fluentmigrator• 830starほど• Apache 2 License
動作RDBMS• SQL Server• SQL Server Compact Edition• PostgreSQL• MySQL• Oracle• SQLite• Jet (MS Access, ACEも動作)» https://github.com/schambers/fluentmigrator/wiki/Fluent-Interface
実行方法• コマンドライン• NAnt• MSBuild• Rake– Ruby + Albacore gem が必要» https://github.com/schambers/fluentmigrator/wiki/Migration-Runners
インストール• NuGetでインストール– 本体• PM> Install-Package FluentMigrator– コマンドラインランナーを使う場合• PM> Install-Package FluentMigrator.Tools
マイグレーションファイル• コード
マイグレーションの実行• 実行.\Migrate.exe--assembly=FluentMigrationTest.exe--provider=jet--connection="Provider=Microsoft.ACE.OLEDB.12.0;DataSource=D:\db\targetdb.accdb"--verbose=True--task=migrate
実行結果の表示CREATE TABLE [hoge]([id] COUNTER NOT NULL,[content] VARCHAR(255),CONSTRAINT [PK_hoge] PRIMARY KEY ([id]))
MS Accessの結果• DDLが実行されている
マイグレーション(DDL)• CREATE TABLECreate.Table("hoge").WithColumn("id").AsInt32().PrimaryKey().Identity().WithColumn("content").AsString().Nullable();
マイグレーション(DDL)• ALTER TABLEAlter.Table("hoge").AddColumn("fuga").AsString().Nullable().AlterColumn("content").AsString().NotNullable();
マイグレーション(DDL)• CREATE INDEXCreate.Index("idx").OnTable("hoge").OnColumn("content");
マイグレーション(DDL)• RENAME COLUMNRename.Column("fuga").OnTable("hoge").To("piyo");
マイグレーション(DML)• INSERTInsert.IntoTable("hoge").Row(new { content = "added" });• UPDATEUpdate.Table("hoge").Set(new { content = "updated" }).Where(new { id = 1 });
ランナーのオプション– assembly» 対象のマイグレーションが含まれるexe/dll– provider» 対象のRDBMS– connection (接続文字列)– task» Migration, Rollback(全件, 1件, 指定ver etc)– verbose» Trueでマイグレーションの詳細を表示
クラウド(Paas)での実行• Azure Websites– 管理画面(Kudu)のConsoleにて• Heroku– Third-Party Buildpacksでビルド• Monoでのビルド– friism/heroku-buildpack-mono– heroku/dotnet-buildpack (ASP.NET 5用?)– One-Off Dynos でHeroku Postgresへ実行• heroku run bash 後
まとめ• FluentMigratorを使えば、EFを使えない環境でもDBマイグレーション可能• 他のDBマイグレーションツールがあれば知りたいです!
参考文献など• 参考文献– FluentMigrator公式Wikiが一番参考になります• https://github.com/schambers/fluentmigrator/wiki• スライドまわり– プレゼンツール• Rabbit (Ruby製)– http://rabbit-shocker.org/ja/– スライドテンプレート• 交差点の真ん中で様のパワーポイント用自作デザインテンプレート– http://sagittarius.dip.jp/toshi/template.php– フォント• フォントな様のやさしさゴシックボールド– http://www.fontna.com/blog/736/