.NETでのデータベース変更の自動化

こんにちは

Migrator.NetおよびECM7.Migratorプロジェクトについてお話したいと思います



Migrator.Netは、Ruby on Railsでの移行に似たデータベースバージョン管理メカニズムです。 Migratorを使用すると、データベース変更操作を自動化し、バージョン管理を自動的に維持できます。



MigratorはC#で記述されており、まず.NETのプロジェクトで使用すると便利です。



まず、これらのプロジェクトの簡単なレビューを行い、次にそれらの「長所」と「短所」を強調します。







基本原則


データベースを変更するには、「移行」を含むアセンブリを作成します。 「移行」はクラスであり、それぞれがデータベース内の小さな変更を表します。



「移行」クラスを作成する場合、特別な移行基本クラスから継承し、2つのメソッドをオーバーライドする必要があります。



データベースで実行する必要があるアクションは、.NETプロジェクトを記述している言語で設定されます。 データベースで基本的な操作を実行するためのクラスとメソッドを含む特別なフレームワークがあります。 任意のSQLクエリを実行することもできます。



移行例


[Migration(7)]

public class AbstractTestMigration : Migration

{

override public void Up()

{

Database.AddTable( "CustomerAddress" ,

new Column( "customer_id" ,

DbType.Int32, ColumnProperty.PrimaryKey),



new Column( "address" ,

DbType.AnsiString, ColumnProperty.NotNull));

}



override public void Down()

{

Database.RemoveTable( "CustomerAddress" );

}

}



* This source code was highlighted with Source Code Highlighter .








ここで何が起こるか見てみましょう:
  1. 「移行」クラスは[Migration(7)]属性でマークされていることがわかります。 属性パラメーター-Upメソッドから変更を行うときに移行が発生するデータベースのバージョン番号を指定するlong値。
  2. 既に述べたように、「移行」クラスは、 移行基本クラスから継承する必要があります。 また、「移行」クラスは、基本クラスのUpおよびDownメソッドを再定義する必要があります。
  3. 基本MigrationクラスにはDatabaseプロパティがあります。 このプロパティには、 ITransformationProviderインターフェイスを実装するオブジェクトが含まれます。 DatabaseオブジェクトでITransformationProviderインターフェイスのメソッドを呼び出すことにより、データベースで操作を実行できます。 たとえば、 DownメソッドはDatabase.RemoveTableを使用してテーブルを削除します。

    ITransformationProviderインターフェイスには、任意のSQLクエリを実行できるint ExecuteNonQuery(string sql)



    メソッドが含まれています。


変更を加える方法


Migratorは、「移行」クラスを実行するいくつかの方法を提供します。
  1. コンソールアプリケーション
  2. NAntのタスク
  3. MsBuildのタスク
  4. プログラムの実行-APIを介してプログラムから「移行」を実行する


これらの各メソッドは、使用するDBMSの種類、接続文字列、取得するデータベースのバージョン番号をパラメーターとして受け取ります。





サポートされているDBMS


Migrator.NETは、さまざまなDBMSと連携できます。 「移行」が開始されると、「方言」クラスがデータベースに接続するためのパラメータとともに移行者に示され、特定のDBMSに対してSQLクエリが生成されます。



Migrator.NETプロジェクトには、MySQL、Oracle、SQLite、MS SQL Server(CEを含む)、PostgreSQLのDBMS用の「方言」があります。



Migrator.NetとECM7.Migratorプロジェクトの違い


この投稿の冒頭で、 Migrator.Netとの別のプロジェクトであるECM7.Migratorについて言及しました 。 さて、彼についてもっとお話ししましょう。



この春、同僚と私はMigrator.NETについて学びました。 私たちはそれを使用しようとしましたが、本当に気に入りました。 現在、私は両方の作品で移住者を使用しています(実際には、合計3つのかなり大規模なプロジェクトが既に実際の状況で機能しています)。

残念ながら、Migrator.NETには不便な点があり、Oracleのプロバイダーには多くのエラーが含まれていることがわかりました(これは、プロジェクトのメインページにgoogleコードで記述されています)。



5月から9月にかけて、Migrator.NETに多数の変更を加えました。いわゆるいくつかのクラス 「カーネル」、Oracleプロバイダーの多くのバグが修正されました。移行ツールの使用をより便利にする「化粧」の改善がいくつかあります。



その結果、変更したコードは元のプロジェクトのコードと大きく異なるため、別のプロジェクトを作成することにしました。 ECM7.MigratorというGoogleコードでレイアウトされているのは彼です。 ドキュメントも部分的に翻訳されました(そして新しいプロジェクト用に修正されました)。



さらに、PostgreSQLサポートは不要なため削除されました。



移住者はどのように役立ちますか?


  1. 移行ツールを使用すると、データベースの変更が便利に伝播されます。 たくさんのスクリプトがあるフォルダーはなく、代わりに唯一のdllがあります。 数百人のユーザーがいるWindowsアプリケーションを更新する必要がある場合、それを感謝すると思います。
  2. 移行を書くと便利です。コンパイル段階での検証、インテリセンスなど。 SQLを手動で作成する人はいません。 通常、GUIを介して生成されます。 多くの場合、多くの「左」チームが生成されます。 移行ツールを使用すると、多くの時間を費やすことなく、すべてを完全に制御できます。
  3. 移行は実行に便利です。 すでに書いたように、NAntとMSBuildの移行者にはタスクがあります。 これらを使用すると、プロジェクトの自動アセンブリ中に移行を簡単に実行できます。 さらに、移行用のソフトウェアツールを使用すると、アプリケーションの起動時にデータベース構造を更新したり、単体テスト用にクリーンなデータベースを作成したりできます。
  4. 移行はDBMSに依存しません。 正直に言うと、複数のDBMSをサポートするプロジェクトに取り組む必要はありませんでした。 しかし、誰かがDBMSから独立している必要があるかもしれません。
  5. 移行では、任意のロジックを簡単に追加できます。 たとえば、ループで大量のテーブルを作成したり、アプリケーション設定で定義されたプレフィックスを各テーブルの名前に追加したりできます。


短所


移住者との仕事中に、私は2つの欠点を感じました。

  1. ユーザーがコマンドライン(私のような)を介してプログラムを操作するのを好まない場合、そのユーザーにとっては、移行を実行できるGUIを備えたプログラムが不足しています。 幸いなことに、この問題は、必要なパラメーターを使用してmigratorコンソールアプリケーションを起動するbatファイルを作成することで迅速に解決されました。
  2. 2つ目の不便な点は、移行を作成するときに、作成済みのデータベースオブジェクトの名前を覚えていないことです。 この問題は解決されていません。 マイグレーションを作成するとき、GUIまたはhbmファイル(多くのプロジェクトでNHibernateを使用しています)で名前を確認します。




移住者ができないこと


移住者は、データベースの構造を考えることからあなたを救いません。 データベースの変更は自動的には生成されません。 これは、データベース上のすべてのアクションを手動で設定するだけでなく、それらを実行するより便利な方法です。



おわりに


一般に、これが移民について伝えたかったことのすべてです。 物語がどれだけ成功したかはあなた次第です。



誰かが移民に興味を持っているなら、私はとても幸せです。 これは、その開発者の作業(したがって私の作業も)が無駄にならなかったことを意味します。 そのような人々が移行者を使用するのを助けるために最善を尽くします-質問に答えて、発見されたバグを素早く修正します。



ご清聴ありがとうございました。



-注

少し前に、 octalforty Wizardbyプロジェクトはすでにここで 議論されてい ました 。 私が理解しているように、これは別の移住者です。

残念ながら、私はこのプロジェクトに非常に簡単に精通しました。 目を引く主な違いは、「移行」が特別な言語で書かれていることです。

実際の条件でWizardbyを使用した場合は、私に書いてください。 その利点/欠点について学び、Migrator.NETと比較することは非常に興味深いでしょう。



All Articles