データベースマイグレーションを使ってみる

使い方はガイドをみれば大体わかるはず。なので、ちょっと引っかかったことを残します。

接続先は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
    );
  }

これでいいんじゃない。