移行は、データベーススキーマの構造と変更を管理する便利な方法です。もちろん、さまざまなSQLファイルを使用して、昔ながらの方法でビジネスを行うことができます。または、実際のデータベーススキーマである1つの大きなファイルでSQLコードを編集することもできます。
ただし、これらの変更を監視するには、ある時点から、生産マシンでの対応する変更の適用は言うまでもなく非常に困難になります。ここでは、チーターの器用さ、熊の強さ、すべての東の賢者の知恵を集めて、すべてを正しく行う必要があります落とさないでください。
しかし、上記の品質のいずれも所有していない場合はどうなりますか? そうです、プロセスを体系化して自動化し、ほとんどの作業を機械に移す必要があります。
すでに興味がある、またはまだわからないが、変更の透過的な履歴があり、1つまたは2つのコンソールコマンドを使用してスキームの任意のバージョンにロールバックできるという見込みがある場合は、魅力的だと思われます。
Ruby on Railsの使用を開始すると、すぐに移行メカニズムに精通し、しばらくすると、この信じられないほど便利なツールがなければどうすればよいか理解できなくなります。
PHPで開発されているプロジェクトに来て、Ruby on Railsでの経験からおなじみの、少なくとも最小限の便利なツールセットを導入しようとしました。 ポイントの1つは、移行をサポートするシステムでした。
いくつかの検索の後、 Ruckusing Migrationsを選択しました。これは、私がRailsで見たものと最も類似しています。 6か月以上たった後、フライトは正常になったと報告しています。
設置
Composerを使用して依存関係を管理していることを前提としています。 そうでない場合は、試してみてください、それは価値があります!
また、必要に応じて、GitHubでリポジトリのクローンを作成できます(例: github.com/ArtemPyanykh/php_migrations_example)。
開始するには、composer.jsonに追加します。
"require" : { "ruckusing/ruckusing-migrations": "dev-master" }
そして実行する
~/dev/php_migrations_example(master)$ php composer.phar install
ComposerはRuckusing Migrationsをプルアップし、vendorsディレクトリをインストールします。
さらに、次のことを行うことをお勧めします。
- まず、次のディレクトリ構造を作成します。
. └── db ├── logs ├── migrations │ ├── main │ ├── php_migrations_example -> main/ │ └── php_migrations_example_test -> main/ └── utility
db
ディレクトリには、移行、構成、その他の便利なものが保存されます。 このディレクトリを、移行に関連するすべての参照ポイントと考えてください。
移行ファイル自体はdb/migrations/main
保存されます。
php_migrations_example
とphp_migrations_example_test
は、開発データベースとテストデータベースの名前です。
対応する名前を持つディレクトリは、main
ディレクトリへの単なるシンボリックリンクです。これは、環境ごとに異なる移行がある可能性は低いためです。
- 次の内容の
db/ruckus
を作成します。
#!/bin/bash ruckus_dir="./../vendor/ruckusing/ruckusing-migrations" if [ ! -d $ruckus_dir ]; then echo "Ruckusing-Migrations wasn't detected. Please, use Composer to install the library." exit fi if [ ! -f "ruckusing.conf.php" ]; then echo "Ruckusing conf. file wasn't detected. Please, create proper ruckusing.conf.php." exit fi if [ "$#" -lt 1 ]; then echo "At least 1 argument required" echo "See ./ruckus --help" exit fi if [ "$1" == "--help" -o "$1" == "-h" ]; then echo "Usage: ./ruckus [--help] <task-name> [<parameter1>[ <parameter2> [...]]]" echo "" echo "The available ruckus commands are:" echo " ./ruckus db:migrate Ruckus scenario for tasks such as db:migrate, db:setup, etc." echo " ./ruckus db:generate <migration_name> Ruckus scenarion for generating migration scaffolding" echo "" exit fi php $ruckus_dir"/ruckus.php" "$1" "${@:2}"
これは、Ruckusing Migrationsでの作業を簡素化するために自分で作成できる小さなスクリプトです。
- 最後に、
db/ruckusing.conf.php
ファイルを作成します。
<?php //---------------------------- // DATABASE CONFIGURATION //---------------------------- /* Valid types (adapters) are Postgres & MySQL: 'type' must be one of: 'pgsql' or 'mysql' */ return array( 'db' => array( 'development' => array( 'type' => 'mysql', 'host' => 'localhost', 'port' => 3306, 'database' => 'php_migrations_example', 'user' => 'root', 'password' => 'root' ), 'test' => array( 'type' => 'mysql', 'host' => 'localhost', 'port' => 3306, 'database' => 'php_migrations_example_test', 'user' => 'root', 'password' => 'root' ) ), 'migrations_dir' => RUCKUSING_WORKING_BASE . '/migrations', 'db_dir' => RUCKUSING_WORKING_BASE . '/utility', 'log_dir' => RUCKUSING_WORKING_BASE . '/logs' ); ?>
それだけです。これ以上の設定は必要ありません。移行システムを正常に統合しました!
使用する
一般的に、すべてが非常に簡単です。 移行を生成することから始めましょう:
~/dev/php_migrations_example(master)$ cd db ~/dev/php_migrations_example/db(master)$ ./ruckus db:generate CreateTestTable Created migration: 20130508145210_CreateTestTable.php
この後、db / migrations / mainディレクトリに、同じ名前(タイムスタンプが異なる)のファイルが次の内容で追加されます。
<?php class CreateTestTable extends Ruckusing_Migration_Base { public function up() { }//up() public function down() { }//down() }
移行には、適用できるだけでなく、変更をロールバックする適切な方法がある場合にキャンセルできるという特性があります。 これは、まさにup()メソッド(変更を適用する)とdown()メソッド(変更をロールバックする)のセマンティクスです。 いくつかのフィールドとインデックスのペアを持つテストテーブルを作成しましょう。 次のようにファイルを補足します。
<?php class CreateTestTable extends Ruckusing_Migration_Base { public function up() { $table = $this->create_table('test', array('options' => 'ENGINE=InnoDB DEFAULT CHARSET=utf8')); $table->column('this', 'integer', array('unsigned' => true, 'null' => false, 'default' => '42')); $table->column('that', 'string', array('limit' => '7')); $table->column('those', 'datetime'); $table->finish(); $this->add_index('test', array('this', 'that'), array('unique' => true)); }//up() public function down() { $this->drop_table('test'); }//down() }
移行を実行します。
~/dev/php_migrations_example/db(master)$ ./ruckus db:migrate Started: 2013-05-08 7:05pm MSK [db:migrate]: Schema version table does not exist. Auto-creating. Creating schema version table: schema_migrations Migrating UP: ========= CreateTestTable ======== (0.31) Finished: 2013-05-08 7:05pm MSK
上記の仕様に完全に準拠したテストテーブルの作成に加えて、schema_migrationsテーブルも作成されていることに気付くでしょう。 これは正常です-これは、Ruckusing Migrationsが適用された移行と適用されなかった移行に関する情報を保存する場所です。
別の環境の移行を単にロールバックまたは開始することもできます。
~/dev/php_migrations_example/db(master)$ ./ruckus db:migrate VERSION=-1 Started: 2013-05-08 7:13pm MSK [db:migrate]: Migrating DOWN: ========= CreateTestTable ======== (0.21) Finished: 2013-05-08 7:13pm MSK ~/dev/php_migrations_example/db(master)$ ./ruckus db:migrate ENV=test Started: 2013-05-08 7:14pm MSK [db:migrate]: Schema version table does not exist. Auto-creating. Creating schema version table: schema_migrations Migrating UP: ========= CreateTestTable ======== (0.24) Finished: 2013-05-08 7:14pm MSK
これは、システムの機能の小さなデモです。 ただし、正しい移行メカニズムを使用してデータベースをバージョン管理することがどれほど簡単で便利であるかが明らかになったと思います。
備考
-
db/
ディレクトリからではなくruckus
スクリプトを実行しようとすると、エラーが発生します。 これは、スクリプト内のすべてのパスが相対パスであり、必要に応じて簡単に修正できるためです。 ただし、1つ考慮する必要があります。デフォルトでは、作業ディレクトリで構成が検索されます。
- 本番環境に移行を適用する場合は、非常に注意する必要があります。かなり重いテーブル(数ギガバイトなど)があり、移行を適用してスキームを何らかの形で変更すると、ほとんどの場合災害になります。 これは、マイグレーション自体の不足ではなく、DBMSの不足ではないかもしれませんが、それでもシステムを使用する可能性をいくらか制限します。 大きなテーブルを更新するには、 Percona Toolkitなどの専用ツールを使用する必要があります 。
参照資料
- GitHubプロジェクトページ: github.com/ruckus/ruckusing-migrations
- GitHubサンプルリポジトリ: github.com/ArtemPyanykh/php_migrations_example
- 作曲者: getcomposer.org