CodeIgniter 3.0でマイグレーションをCLIから操作するCli for CodeIgniter
マイグレーションとは、簡単に言うとデータベースのテーブル定義をコードによりバージョン管理する仕組みです。CodeIgniterにも2.1.0からMigrationクラスが標準で含まれています。
日本語の情報としては、以下がCodeIgniter 2.xのものですが詳しいです。
CodeIgniter 3.0では、マイグレーションファイルのバージョンのデフォルトが「3桁の数字」ではなく「タイムスタンプ(YYYYMMDDHHMMSS)」に変更されていますが、他は同じだと思います。
ここで、CodeIgniterでは、マイグレーションファイルは手動で作成する必要があります。そうなると、20150507043122_Create_bbs.php
みたいなファイル名を自分で入力して作成しないといけません。
また、マイグレーションの状態がどうなっているか確認する方法もデフォルトではありません(そもそもマイグレーションを実行するためのスクリプトも標準ではなく、サンプルコードがユーザガイドに掲載されているだけなんですが)。
ということで、ちょっと面倒な感じなので、コマンドラインからマイグレーションを操作できるようにしてみました。
そのためにコマンドライン(CLI)からコマンドを実行する仕組みとして「Cli for CodeIgniter」を作成しました。
Cli for CodeIgniterのインストール
Cli for CodeIgniter(以下、codeigniter-cli)は、CodeIgniterのプロジェクトの中にComposerでインストールします。PHP 5.4以上が必要です。
CodeIgniterのフォルダ構成
デフォルトでは、CodeIgniterのプロジェクトは以下のフォルダ構成が想定されています。異なる場合はcodeigniter-cliの設定を変更します(後述)。
codeigniter/
├── application/
├── composer.json
├── composer.lock
├── public/
│ └── index.php
└── vendor/
└── codeigniter/
└── framework/
└── system/
CodeIgniterのインストールがまだの場合は、以下でインストールできます。詳細は、「Codeigniter 3.0をコマンド一発でインストールするCodeIgniter Composer Installer」を参照してください。
$ composer create-project kenjis/codeigniter-composer-installer codeigniter
codeigniter-cliのインストール
CodeIgniterのプロジェクトのルートフォルダに移動して、codeigniter-cliをインストールします。
$ cd codeigniter/
$ composer require kenjis/codeigniter-cli:1.0.x@dev --dev
codeigniter-cliのコマンドファイルと設定フォルダなどをCodeIgniterのプロジェクトにコピーします。
$ php vendor/kenjis/codeigniter-cli/install.php
以下のようにインストールされます。上記のコマンドは以下のファイルがすでに存在する場合はファイルを上書きします。
codeigniter/
├── application/
├── ci_instance.php ... CodeIgniterインスタンス生成用のスクリプト
├── cli ... コマンドファイル
├── config/ ... 設定フォルダ
└── vendor/
codeigniter-cliの設定
フォルダ構成が想定される場合と異なるときは、ci_instance.php
の以下のパスを変更します。
$system_path = 'vendor/codeigniter/framework/system';
$application_folder = 'application';
$doc_root = 'public';
これでインストールは完了です。
cliコマンドの使い方
$ ./cli
または、
$ php cli
でコマンドの一覧が表示されます。
データベースマイグレーション
それでは、データベースマイグレーションを使ってみましょう。
その前に、CodeIgniterのデータベース接続の設定を済ませてください。
マイグレーションの設定
マイグレーション設定ファイル(config/migration.php
)を変更します。
マイグレーションを使用するのでmigration_enabled
をTRUE
に変更します。
それから、マイグレーションファイルを配置するフォルダmigration_path
をAPPPATH.'database/migrations/'
に変更します。migration_path
は好みの問題なのでデフォルトのままでも構いません。
--- a/application/config/migration.php
+++ b/application/config/migration.php
@@ -11,7 +11,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
| and disable it back when you're done.
|
*/
-$config['migration_enabled'] = FALSE;
+$config['migration_enabled'] = TRUE;
/*
|--------------------------------------------------------------------------
@@ -81,4 +81,4 @@ $config['migration_version'] = 0;
| Also, writing permission is required within the migrations path.
|
*/
-$config['migration_path'] = APPPATH.'migrations/';
+$config['migration_path'] = APPPATH.'database/migrations/';
そして、migration_path
に設定されているフォルダを作成してください。
bash-3.2$ mkdir -p application/database/migrations
では、マイグレーションの現状をcli migrate version
コマンドで確認してみましょう。
bash-3.2$ ./cli migrate version
以下のように3つのバージョンが表示されました。
current: 0 (in config/migration.php)
database: 0 (in database table)
latest: null (in migration files)
ここで
current
はマイグレーション設定ファイルに記載されているバージョンdatabase
はデータベースに記録されているバージョン(データベースはこのバージョンまでマイグレーションされている)latest
はマイグレーションファイルの中の最新バージョン
です。
初期状態なので0やnullが表示されています。
マイグレーションファイルの作成
マイグレーションファイルとは、データベースへの変更操作を記録するクラスです。
例としてbbs
テーブルを作成するマイグレーションファイルをcli generate migration
コマンドで作成してみましょう。最後の引数はクラス名になります。
bash-3.2$ ./cli generate migration Create_bbs
以下のように表示されました。
Generated: application/database/migrations/20150507043122_Create_bbs.php
20150507043122_Create_bbs.php
が作成されたことがわかります。20150507043122
がマイグレーションのバージョンです。
中身は以下のようになっています。
<?php
/**
* Migration: Create_bbs
*
* Created by: Cli for CodeIgniter <https://github.com/kenjis/codeigniter-cli>
* Created on: 2015/05/07 04:31:22
*/
class Migration_Create_bbs extends CI_Migration {
public function up()
{
// $this->dbforge->add_field(array(
// 'blog_id' => array(
// 'type' => 'INT',
// 'constraint' => 11,
// 'auto_increment' => TRUE
// ),
// 'blog_title' => array(
// 'type' => 'VARCHAR',
// 'constraint' => 100,
// ),
// 'blog_description' => array(
// 'type' => 'TEXT',
// 'null' => TRUE,
// ),
// ));
// $this->dbforge->add_key('blog_id', TRUE);
// $this->dbforge->create_table('blog');
}
public function down()
{
// $this->dbforge->drop_table('blog');
}
}
ここで、
up()
メソッドにこのマイグレーションが実行されたときに実行するコードdown()
メソッドに前のバージョンに戻す場合に実行するコード
を記載します。例えば、以下のようになります。
<?php
/**
* Migration: Create_bbs
*
* Created by: Cli for CodeIgniter <https://github.com/kenjis/codeigniter-cli>
* Created on: 2015/05/07 04:31:22
*/
class Migration_Create_bbs extends CI_Migration {
public function up()
{
$this->dbforge->add_field(array(
'id' => array(
'type' => 'INT',
'constraint' => 11,
'auto_increment' => TRUE
),
'name' => array(
'type' => 'VARCHAR',
'constraint' => '64',
),
'subject' => array(
'type' => 'VARCHAR',
'constraint' => '128',
'null' => TRUE,
),
'body' => array(
'type' => 'TEXT',
'null' => TRUE,
)
));
$this->dbforge->add_key('id', TRUE);
$this->dbforge->create_table('bbs');
}
public function down()
{
$this->dbforge->drop_table('bbs');
}
}
さて、ここでcli migrate version
でバージョンを確認してみましょう。
bash-3.2$ ./cli migrate version
current: 0 (in config/migration.php)
database: 0 (in database table)
latest: 20150507043122 (in migration files)
latest
(マイグレーションファイルの最新バージョン)が変わりました。
マイグレーションの実行
マイグレーションの実行は、設定ファイルにあるバージョンまでデータベースのバージョンを上げるというものです。
なので、まず、マイグレーション設定ファイル(config/migration.php
)のmigration_version
を最新のマイグレーションファイルのバージョン(20150507043122
)に変更します。
--- a/application/config/migration.php
+++ b/application/config/migration.php
@@ -69,7 +69,7 @@ $config['migration_auto_latest'] = FALSE;
| be upgraded / downgraded to.
|
*/
-$config['migration_version'] = 0;
+$config['migration_version'] = 20150507043122;
/*
|--------------------------------------------------------------------------
そして、マイグレーションを実行します。
bash-3.2$ ./cli migrate
current: 20150507043122 (in config/migration.php)
database: 20150507043122 (in database table)
latest: 20150507043122 (in migration files)
すべてのバージョンが一致して最新になりました。
データベースの中身を確認してみましょう。
bash-3.2$ sqlite3 application/sqlite-database.db
SQLite version 3.8.5 2014-08-15 22:37:57
Enter ".help" for usage hints.
sqlite> .schema bbs
CREATE TABLE "bbs" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"name" VARCHAR NOT NULL,
"subject" VARCHAR NULL,
"body" TEXT NULL
);
sqlite> select * from migrations;
20150507043122
テーブルbbs
が作成され、マイグレーションのバージョンが最新になっていることがわかります。
マイグレーションファイルの一覧表示
以下のようにマイグレーションファイルを追加したとします。
bash-3.2$ ./cli generate migration Create_captcha
bash-3.2$ ./cli generate migration Create_category
bash-3.2$ ./cli generate migration Create_product
ここで、cli migrate status
コマンドを実行します。
bash-3.2$ ./cli migrate status
すると、以下のようにマイグレーションファイルの一覧が表示されます。
application/database/migrations/
20150507043122_Create_bbs.php (current/database)
20150507060215_Create_captcha.php
20150507060219_Create_category.php
20150507060223_Create_product.php
データベースの状態はバージョン20150507043122
であり、実行されていないマイグレーションがあることがわかります。
codeigniter-cliについて
codeigniter-cliはそもそもCodeIgniter 3.0のためのCLIツールです。コマンドを作成するための仕組みです。ユーザがコマンドを作成することもできます。
また、マイグレーション以外にも
- データベースシーディングのための
seed
コマンド - コントローラを実行する
run
コマンド
が付属しています。
Scrutinizerのスコアは9以上(very good)、テストも書かれておりテストカバー率は90%以上です。
興味のある方は、以下を参照してください。
関連
Date: 2015/05/07