Symfoware

Symfowareについての考察blog

CodeIgniter 3 データベースのマイグレーション(Library Reference - Migrations Class)

CodeIgniter User Guide

Library ReferenceのMigrations Classについて調べてみます。
Migrations Class



Migrations Class



マイグレーション機能を使用すれば、データベースのスキーマバージョンの
管理が行えるようです。

設定ファイルは「application/config/migration.php」です。





Migration file names



バージョン管理の方法は2通り提供されています。

・Sequential
001から始まる連番での管理。

・Timestamp
YYYYMMDDHHIISS形式(例えば、20121031100537)という日付による管理。

設定ファイルの
$config['migration_type']
で変更可能です。



Create a Migration



今回はタイムスタンプによるマイグレーションを試してみます。

application/migrations/というディレクトリを作成。
20121031100537_add_blog.phpという名前のファイルを作成し、以下の内容を記載します。


  1. <?php
  2. defined('BASEPATH') OR exit('No direct script access allowed');
  3. class Migration_Add_blog extends CI_Migration {
  4.         public function up()
  5.         {
  6.                 $this->dbforge->add_field(array(
  7.                         'blog_id' => array(
  8.                                 'type' => 'INT',
  9.                                 'constraint' => 5,
  10.                                 'unsigned' => TRUE,
  11.                                 'auto_increment' => TRUE
  12.                         ),
  13.                         'blog_title' => array(
  14.                                 'type' => 'VARCHAR',
  15.                                 'constraint' => '100',
  16.                         ),
  17.                         'blog_description' => array(
  18.                                 'type' => 'TEXT',
  19.                                 'null' => TRUE,
  20.                         ),
  21.                 ));
  22.                 $this->dbforge->add_key('blog_id', TRUE);
  23.                 $this->dbforge->create_table('blog');
  24.         }
  25.         public function down()
  26.         {
  27.                 $this->dbforge->drop_table('blog');
  28.         }
  29. }





application/config/migration.phpに


  1. $config['migration_version'] = 20121031100537;.



と設定しておきます。




Usage Example



マイグレーションを実行するコントローラーを作成します。
application/controllers/Migrate.php


  1. <?php
  2. class Migrate extends CI_Controller
  3. {
  4.         public function index()
  5.         {
  6.                 $this->load->library('migration');
  7.                 if ($this->migration->current() === FALSE)
  8.                 {
  9.                         show_error($this->migration->error_string());
  10.                 }
  11.         }
  12. }




ブラウザで、/migrate/を表示すればマイグレーションが実行されます。





使ってみる



ドキュメントだけでは、理解できない箇所があったので実際に動かしてみます。
この機能を使用するには、もちろんデータベース接続の設定が必要です。

チュートリアル2 News section
こちらで行った設定をそのまま使用することにしました。

上記のチュートリアル通り設定しても動きません。
こんなエラーが表示されます。


Migrations has been loaded but is disabled or set up incorrectly.




migration.phpの設定で、「migration_enabled」をTRUEにしておく必要があります。


  1. $config['migration_enabled'] = TRUE;




この状態でマイグレーションを実行すると、
blogテーブルに加え、migrationsテーブルが作成されます。


MariaDB [tutorial]> show tables;
+--------------------+
| Tables_in_tutorial |
+--------------------+
| blog             |
| migrations         |
+--------------------+




内容は、現在のバージョンでした。


MariaDB [tutorial]> select * from migrations;
+----------------+
| version        |
+----------------+
| 20121031100537 |
+----------------+





ダウングレードというか、実行したマイグレーションを取り消すには、
migration.phpのmigration_versionを0に戻します。


  1. $config['migration_version'] = 0;




ブラウザで、/migrate/を表示するとblogテーブルが削除されます。



実際は、マイグレーションのバージョンは番号で指定したいのでは?と思い
sequentialなタイプを試してみましたが、ファイルのプリフィックスは
「001」のように3桁フォーマットが矯正されます。
ちょっと使いにくいですね。



また、1ファイル1テーブルのcreate文を定義しようと


20121031100537_add_blog.php
20121031100537_add_news.php



という同じバージョンのファイルを2つ作成したのですが、
重複エラーになりました。


20121031100537_add_blog.php
20121031100538_add_news.php



のように微妙にずらして20121031100538までマイグレーションするか、
一つのファイルにまとめるのが良さそうです。




カラムの追加と削除



blogテーブルにカラムを追加してみます。
20131031100537_add_blog2.phpというファイルを作成しました。


  1. <?php
  2. defined('BASEPATH') OR exit('No direct script access allowed');
  3. class Migration_Add_blog2 extends CI_Migration {
  4.         public function up()
  5.         {
  6.                 $fields = array(
  7.                         'preferences' => array('type' => 'TEXT')
  8.                 );
  9.                 $this->dbforge->add_column('blog', $fields);
  10.         }
  11.         public function down()
  12.         {
  13.                 $this->dbforge->drop_column('blog', 'preferences');
  14.         }
  15. }




ちょっと引っかかったのが、同じクラス名のマイグレーションは作成できない点でしょうか。
うまい命名規約を考えておかないと、サンプルのようにxx2とかいうファイル名になりそうです。


マイグレーション実行前のblogテーブル。


MariaDB [tutorial]> show columns from blog;
+------------------+-----------------+------+-----+---------+----------------+
| Field            | Type            | Null | Key | Default | Extra         |
+------------------+-----------------+------+-----+---------+----------------+
| blog_id         | int(5) unsigned | NO | PRI | NULL    | auto_increment |
| blog_title     | varchar(100)    | NO |     | NULL    |                |
| blog_description | text            | YES |     | NULL    |                |
+------------------+-----------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)




実行後、ちゃんとpreferencesフィールドが追加されました。


MariaDB [tutorial]> show columns from blog;
+------------------+-----------------+------+-----+---------+----------------+
| Field            | Type            | Null | Key | Default | Extra         |
+------------------+-----------------+------+-----+---------+----------------+
| blog_id         | int(5) unsigned | NO | PRI | NULL    | auto_increment |
| blog_title     | varchar(100)    | NO |     | NULL    |                |
| blog_description | text            | YES |     | NULL    |                |
| preferences     | text            | YES |     | NULL    |                |
+------------------+-----------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)










インデックスの追加



運用後、テーブルにインデックスを追加したいことがあると思います。
テーブル作成時のインデックス作成はadd_keyの第二引数を未指定、もしくはFALSEに
すれば良さそうなのですが、途中の追加はなさそうです。

Create MySQL table through Codeigniter DBforge class
直接SQLを実行すれば良いようです。


  1. <?php
  2. defined('BASEPATH') OR exit('No direct script access allowed');
  3. class Migration_Add_blog3 extends CI_Migration {
  4.         public function up()
  5.         {
  6.             $query = "ALTER TABLE `blog` ADD INDEX `idx_blog_blog_title` (`blog_title`);";
  7.             $this->db->query ( $query );
  8.         }
  9.         public function down()
  10.         {
  11.             $query = "ALTER TABLE `blog` DROP INDEX `idx_blog_blog_title`;";
  12.             $this->db->query ( $query );
  13.         }
  14. }




インデックスが作成されました。


MariaDB [tutorial]> show columns from blog;
+------------------+-----------------+------+-----+---------+----------------+
| Field            | Type            | Null | Key | Default | Extra         |
+------------------+-----------------+------+-----+---------+----------------+
| blog_id         | int(5) unsigned | NO | PRI | NULL    | auto_increment |
| blog_title     | varchar(100)    | NO | MUL | NULL    |                |
| blog_description | text            | YES |     | NULL    |                |
| preferences     | text            | YES |     | NULL    |                |
+------------------+-----------------+------+-----+---------+----------------+







初期データの追加



マスターデータ等、テーブルの作成と同時にデータの更新を行いたい場合が
あるかと思います。

インデックス作成と同じ手法が使えそうです。


  1. <?php
  2. defined('BASEPATH') OR exit('No direct script access allowed');
  3. class Migration_Add_blog4 extends CI_Migration {
  4.         public function up()
  5.         {
  6.             $data = array(
  7.                 'blog_title' => 'Symfoware',
  8.                 'blog_description' => 'Symfoware description',
  9.                 'preferences' => 'Symfoware preferences'
  10.             );
  11.             
  12.             $this->db->insert('blog', $data);
  13.         }
  14.         public function down()
  15.         {
  16.             $query = "delete from blog;";
  17.             $this->db->query ( $query );
  18.         }
  19. }




初期データが登録出来ました。


MariaDB [tutorial]> select * from blog;
+---------+------------+-----------------------+-----------------------+
| blog_id | blog_title | blog_description     | preferences         |
+---------+------------+-----------------------+-----------------------+
|     1 | Symfoware | Symfoware description | Symfoware preferences |
+---------+------------+-----------------------+-----------------------+







CodeIgniter 3のユーザーガイド(User Guide)まとめ
関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2015/02/01(日) 18:50:12|
  2. PHP
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<CodeIgniter 3 ユニットテストクラス(Library Reference - Unit Testing Class) | ホーム | CodeIgniter 3 設定ファイルの読み込み(Library Reference - Config Class)>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1624-4d182745
この記事にトラックバックする(FC2ブログユーザー)