Engineer as a Lifestyle @tenkoma

What We Find Changes Who We Become -- Peter Morville『アンビエント・ファインダビリティ 』

CakePHP 2.0のFixtureでテーブルを生成すると、通常オンメモリにテーブルが生成される

…つまり高速でテストを実行できることが期待でき、HDDやSSDにもやさしい

CakePHP2.0からFixtureでMySQLのMEMORYエンジンが使われる場合の回避方法 | tipshare.info

こちらとしてはテスト時にデータベースをオンメモリに生成する方法を探していたのでむしろ好都合だった。

検証してみたら、そんなことはなかった…まぁ、CakePHP2.0.3ですけど。どういうことか調べてみた。

lib/Cake/TestSuite/Fixture/CakeTestFixture.php 145行目〜
<?php
if (empty($this->fields['tableParameters']['engine'])) {
    $canUseMemory = true;
    foreach($this->fields as $field => $args) {

        if (is_string($args)) {
            $type = $args;
        } elseif (!empty($args['type'])) {
            $type = $args['type'];
        } else {
            continue;
        }

        if (in_array($type, array('blob', 'text', 'binary'))) {
        $canUseMemory = false;
            break;
        }
    }

    if ($canUseMemory) {
        $this->fields['tableParameters']['engine'] = 'MEMORY';
    }
}

blob,text,binary型を使ってるとMEMORYエンジンは使われないと。
強制的につくってみよう。

CREATE TABLE text_contain_table (
  id INT AUTO_INCREMENT not null,
  body text not null,
  primary key (id)
) ENGINE=MEMORY;
ERROR 1163 (42000): The used table type doesn't support BLOB/TEXT columns

だめだ。ドキュメントにも書いてあった。

MySQL :: MySQL 5.5 Reference Manual :: 15.4 The MEMORY Storage Engine

MEMORY tables cannot contain BLOB or TEXT columns.

考えてみたら、たった100文字入れられれば十分なカラムだったのでVARCHAR(100)に変更しましたよ

まとめ

テーブルにtext/blob型のカラムが含まれていると、MySQL 5.5 ではMEMORYエンジンを使ったテストはできません
CakePHP 2.0 のテストでオンメモリのテーブルを使いたければ、安易にtext型を使わないで、VARCHAR型にできないか検討しましょう