Zend Frameworkでのデータベース移行:Akrabat_Db_Schema_Manager

Zend Frameworkで1つの巨大なプロジェクトに取り組む過程で、データベースを移行し、バージョン間を移動する必要がありました。 更新に加えて、いわゆるダウンデートが必要でした。 ちょっとしたグーグルが、Rob Alan(以下著者)による興味深い記事「Akrabat_Db_Schema_Manager:Zend Frameworkデータベースの移行」に出会いました。 この記事は、オリジナルの翻訳ではなく、それと合成された問題の統合です。 これについて説明します。



データベースの各変更(列、テーブル、インデックス、キーなどの追加)の後、個別の移行ファイルを作成する必要があります。 このようなファイルは、。/ scripts / migrationsディレクトリに配置できます。 著者は、移行ファイルに001-CreateUsersTable.phpという名前を付けることを提案しています。 番号は、これらのファイルが起動される順序を決定します。 基本的に[シリアル番号]-[移行の簡単な説明] .php しかし、これはあまり有益ではありません。 したがって、移行を[リビジョン番号]-[移行の簡単な説明] .phpと呼ぶことにしました。 hgを使用する場合は、チェンジセットシーケンス番号を使用できます。 この点で、クラスAkrabat_Db_Schema_Managerを少し書き直さなければなりませんでした。 1つのリビジョンに複数の移行を含めることができ、ファイル名が再定義されました。 _getMigrationFiles()メソッドは、次の形式の配列を返しません。

$files["v$versionNumber"] = array( 'path'=>$path, 'filename'=>$entry, 'version'=>$versionNumber, 'classname'=>$className);   : $files["v$versionNumber"][] = array( 'path'=>$path, 'filename'=>$entry, 'version'=>$versionNumber, 'classname'=>$className);
      
      





したがって、変更は_processFile($ migration、$ direction)メソッドにも影響します。このメソッドには、$ migrationパラメーターが配列としてではなく、配列の配列として渡されました。 にする人は、クラスのソースコードをGitHubに投稿しますが、ここでは主な近代化アルゴリズムについて説明します。



移行ファイルには、Akrabat_Db_Schema_AbstractChangeから継承されたクラスが含まれ、up()およびdown()の2つのメソッドが含まれます。 up()メソッドはデータベース更新プロセスを開始し、down()-リビジョンロールバックの場合。 著者が引用したわずかに変更された例を次に示します。

 class CreateUsersTable extends Akrabat_Db_Schema_AbstractChange { function up() { $tableName = $this->_tablePrefix . 'users'; $sql = "CREATE TABLE IF NOT EXISTS $tableName ( id int(11) NOT NULL AUTO_INCREMENT, username varchar(50) NOT NULL, password varchar(75) NOT NULL, roles varchar(200) NOT NULL DEFAULT 'user', PRIMARY KEY (id) )"; $this->_db->query($sql); $data = array(); $data['username'] = 'admin'; $data['password'] = sha1('password'); $data['roles'] = 'user,admin'; $this->_db->insert('users', $data); } function down() { $tableName = $this->_tablePrefix . 'users'; $sql = "DROP TABLE IF EXISTS $tableName"; $this->_db->query($sql); } }
      
      





この例では、主要なresources.db.table_prefixで構成ファイルに指定されているテーブルプレフィックスのサポートを導入しました。 しかし、やはり1マイナスがあり、クラス名は[移行の簡単な説明]と一致し、少なくとも2つの同一の説明がある場合、致命的なエラー:クラスを再宣言できませんがクラッシュします。 これを行うには、配列「classname」のインデックスを次のように定義します

 'classname' => $className.$versionNumber
      
      





同様に、クラスを呼び出します-これにより、ミスを回避できます。

そして今-最もおいしい。 このすべてをzend Toolに固定します。 Zend Toolのインストール方法については説明しませんが、Zend Toolについてはすでに多くのことを書いています。 まず、Akrabat ZFライブラリの保存場所を決めましょう。すべてのPHPライブラリを/ usr / share / php /に保存することを好みます。つまり、そのパスは/ usr / share / php / Akrabatになります。 残りは簡単です:

 $ zf --setup storage-directory $ zf --setup config-file $ echo "`php -r 'echo get_include_path().PATH_SEPARATOR;'`/usr/share/php/Akrabat">~/.zf.ini $ echo 'basicloader.classes.0 = "Akrabat_Tool_DatabaseSchemaProvider"'>>~/.zf.ini
      
      





次に、すべてが機能することを確認します。

 $ zf ? database-schema
      
      





同様のものが表示されるはずです:

 Zend Framework Command Line Console Tool v1.11.11 Actions supported by provider "DatabaseSchema" DatabaseSchema zf update database-schema env[=development] dir[=./scripts/migrations] zf update-to database-schema version env[=development] dir[=./scripts/migrations] zf decrement database-schema versions[=1] env[=development] dir[=./scripts/migrations] zf increment database-schema versions[=1] env[=development] dir[=./scripts/migrations] zf current database-schema env[=development] dir[=./migrations] zf get-table-prefix database-schema
      
      





ソース


  1. 著者の記事
  2. GitHub.comのAkrabat ZFライブラリ



All Articles