データベースマイグレーションを使ってみる
使い方はガイドをみれば大体わかるはず。なので、ちょっと引っかかったことを残します。
接続先はconsole.phpのDB
yiic migrate は webapp/protected/config/console.php の DB を使う。yiic model は main.php の DB を使ったので油断してました。
カラム型の変換
<?php class m110720_122652_first extends CDbMigration { public function up() { $this->createTable('tbl_news', array( 'id' => 'pk', 'title' => 'string NOT NULL', 'content' => 'text', )); } }
とガイドのように書くとMYSQLの場合、次のようなCREATE TABLEになるようです。
CREATE TABLE `tbl_news` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, `content` text, PRIMARY KEY (`id`) ) ENGINE=InnoDB;
- 'pk' → int(11) NOT NULL AUTO_INCREMENT
- 'string NOT NULL' → varchar(255) NOT NULL
- 'text' → text
になってます。DBMSの型表現の違いを吸収するためなんでしょうか。
$this->createTable()のカラム指定とSQLのカラム型変換は英語ガイドのコメントにあります。というかここか。
これは書けない
<?php $this->createTable('tbl_news', array( 'id' => 'int(5) NOT NULL AUTO_INCREMENT', 'title' => 'string NOT NULL', 'content' => 'text', ), 'ENGINE=MyISAM' );
とすると「AUTO_INCREMENT」「ENGINE=MyISAM」が通りませんでした。うーん。
生SQLで書ける
勝手にInnoDBにされてもなあ、INT(11)に UNSIGNED 付けたいなあ、PlayFrameworkみたいに生SQLでマイグレーションできないのと思ったら「$this->execute()」でSQLをそのまま実行できました。
<?php class m110720_122652_first extends CDbMigration { public function up() { $this->execute(<<<SQL CREATE TABLE `tbl_news` ( `id` int(5) NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, `content` text, PRIMARY KEY (`id`) ) ENGINE=MyISAM; SQL ); }
これでいいんじゃない。