…つまり高速でテストを実行できることが期待でき、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)に変更しましたよ