ポイント
- Pimple もインストールすること。さもないと、phpmig migrate 時に Fatal error: Class ‘Pimpli¥Container’ not found in … とエラーになった。
- Pimple インストール方法については、phpmig の README には記載されていないので注意。
環境・バージョン
- CentOS release 6.8 (final)
- PHP 5.3.3 (cli) (built: Aug 11 2016 20:33:53)
- Composer version 1.2.0 2016-07-19 01:28:52
- davedevelopment/phpmig (v1.2.0)
- pimple/pimple (v3.0.2)
お試し対象の MySQL データベース
- DB 名: phpmigdb
- ユーザ名: phpmiguser
- パスワード: phpmigpassword
コマンドラインから、次のようにして作成いたしました。
mysql -u root -pvagrant <<EOT GRANT ALL PRIVILEGES ON phpmigdb.* TO phpmiguser@localhost IDENTIFIED BY 'phpmigdbpassword'; FLUSH PRIVILEGES; CREATE DATABASE phpmigdb CHARACTER SET utf8; EOT
phpmig インストール手順
次のコマンドを実行して、Composer、phpmig、pimple をインストールいたします。
curl -sS https://getcomposer.org/installer | php php composer.phar require davedevelopment/phpmig php composer.phar require pimple/pimple ~3.0
実際の様子ですの。phpmig の前に Pimple をインストールしてしまいましたけれども、問題ありませんわ♪
$ curl -sS https://getcomposer.org/installer | php Downloading 1.2.0... Composer successfully installed to: /home/vagrant/composer.phar Use it: php composer.phar Some settings on your machine may cause stability issues with Composer. If you encounter issues, try to change the following: Your PHP (5.3.3) is quite old, upgrading to PHP 5.3.4 or higher is recommended. Composer works with 5.3.2+ for most people, but there might be edge case issues. The xdebug extension is loaded, this can slow down Composer a little. Disabling it when using Composer is recommended. $ $ php composer.phar require pimple/pimple ~3.0 You are running composer with xdebug enabled. This has a major impact on runtime performance. See https://getcomposer.org/xdebug Your version of PHP, 5.3.3, is affected by CVE-2013-6420 and cannot safely perform certificate validation, we strongly suggest you upgrade. ./composer.json has been created Loading composer repositories with package information Updating dependencies (including require-dev) - Installing pimple/pimple (v3.0.2) Downloading: 100% Writing lock file Generating autoload files $ $ php composer.phar require davedevelopment/phpmig Your version of PHP, 5.3.3, is affected by CVE-2013-6420 and cannot safely perform certificate validation, we strongly suggest you upgrade. You are running composer with xdebug enabled. This has a major impact on runtime performance. See https://getcomposer.org/xdebug Using version ^1.2 for davedevelopment/phpmig ./composer.json has been updated Loading composer repositories with package information Updating dependencies (including require-dev) - Installing symfony/class-loader (v2.6.13) Downloading: 100% - Installing symfony/filesystem (v2.6.13) Downloading: 100% - Installing symfony/config (v2.6.13) Downloading: 100% - Installing symfony/yaml (v2.6.13) Downloading: 100% - Installing symfony/console (v2.6.13) Downloading: 100% - Installing davedevelopment/phpmig (v1.2.0) Downloading: 100% symfony/console suggests installing symfony/event-dispatcher () symfony/console suggests installing symfony/process () symfony/console suggests installing psr/log (For using the console logger) Writing lock file Generating autoload files $
phpmig 初期化
次の初期化コマンドを実行することで、設定などを記載するブートストラップファイル phpmig.php と、マイグレーションファイルを入れるディレクトリ migrations が作成されます。
vendor/bin/phpmig init
実際の様子ですわ。
$ vendor/bin/phpmig init +d ./migrations Place your migration files in here +f ./phpmig.php Create services in here $
ブートストラップファイル phpmig.php の編集
init コマンドで作られたファイルは、次のようになりました。
<?php use \Phpmig\Adapter; $container = new ArrayObject(); // replace this with a better Phpmig\Adapter\AdapterInterface $container['phpmig.adapter'] = new Adapter\File\Flat(__DIR__ . DIRECTORY_SEPARATOR . 'migrations/.migrations.log'); $container['phpmig.migrations_path'] = __DIR__ . DIRECTORY_SEPARATOR . 'migrations'; // You can also provide an array of migration files // $container['phpmig.migrations'] = array_merge( // glob('migrations_1/*.php'), // glob('migrations_2/*.php') // ); return $container;
このままでは、MySQL に接続することができません。また、Pimple を使用するようにもなっておりません。
これを次のように修正いたしました。Pimple を導入し、DB接続設定を追記していますの。
<?php use \Phpmig\Adapter; use Pimple\Container; $container = new Container(); $container['db'] = function () { $dbh = new PDO('mysql:dbname=phpmigdb;host=127.0.0.1','phpmiguser','phpmigdbpassword'); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); return $dbh; }; // replace this with a better Phpmig\Adapter\AdapterInterface $container['phpmig.adapter'] = new Adapter\File\Flat(__DIR__ . DIRECTORY_SEPARATOR . 'migrations/.migrations.log'); $container['phpmig.migrations_path'] = __DIR__ . DIRECTORY_SEPARATOR . 'migrations'; // You can also provide an array of migration files // $container['phpmig.migrations'] = array_merge( // glob('migrations_1/*.php'), // glob('migrations_2/*.php') // ); return $container;
これで、準備完了です♪
phpmig を使用する。
phpmig_test テーブルを migrate コマンドで作成し、rollback コマンドで削除してみます。
マイグレーションファイルの雛形を作成し、編集
vendor/bin/phpmig generate AddTestTable
実践しますと、指定した名前をベースにファイルが生成されたことがわかります。
$ vendor/bin/phpmig generate AddTestTable +f ./migrations/20160831055626_AddTestTable.php $
このマイグレーションファイルの up および down メソッド内を作っていきます。
- up メソッドにphpmig_tesr テーブル作成実行を記述
- down メソッドにphpmig_tesr テーブル削除実行を記述
次のようになりました。
<?php use Phpmig\Migration\Migration; class AddTestTable extends Migration { /** * Do the migration */ public function up() { $sql = "CREATE TABLE `phpmig_test` (id INTEGER, name TEXT);"; $container = $this->getContainer(); $container['db']->query($sql); } /** * Undo the migration */ public function down() { $sql = "DROP TABLE IF EXISTS `phpmig_test`;"; $container = $this->getContainer(); $container['db']->query($sql); } }
マイグレーション実施
vendor/bin/phpmig migrate
実行しますと、次のようになりました。これで成功です!なお、失敗した場合は、エラーが、実施されなかった場合は何も表示されませんでした。
$ vendor/bin/phpmig migrate == 20160831055626 AddTestTable migrating == 20160831055626 AddTestTable migrated 0.0402s $
データベースを見てみると、確かにテーブルが作成されておりました!
ロールバック実施
vendor/bin/phpmig rollback
実行すると、migrate の時と同じように表示され、成功したことがわかります♪
$ vendor/bin/phpmig rollback == 20160831055626 AddTestTable reverting == 20160831055626 AddTestTable reverted 0.0018s $
もちろん、データベースを確認してみるとテーブルが削除されておりました♪
おわりに
次のページが参考になりました。ありがとう存じます!
- PHPのお手軽データベースマイグレーションツール「phpmig」を使ってみる – アラタナエンジニアブログ
- [phpmig]PHPでマイグレーション – Qiita
- PHPで使えるDBマイグレーションツール phpmig – エンジニアきまぐれTips
- Composer
- davedevelopment/phpmig: Simple migrations system for php
- fabpot/Pimple: A small PHP 5.3 dependency injection container
日本語の情報は数年前以上のものが大半で、実情とは変わってきているため、そのまま使えずエラーとなる場合がありました><。
加えて、Composer の使い方が、phpmig を使えるようになった今でもですけれども、よく理解していないために、Pimple も合わせてインストールする必要性に気が付かず、時間がかかってしまいました><。
ですので、今回ははじめから丁寧に一通りの使い方をノートいたしました。
以上です。