その他
    ホーム 技術発信 DoRuby MyISAMテーブル(Sennaを使った全文検索など)を利用している場合にテストでこけた場合の対処法

    MyISAMテーブル(Sennaを使った全文検索など)を利用している場合にテストでこけた場合の対処法

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    ご無沙汰しています。KBMJのプログラマのx5rです。

    今回は、MySQL+Sennaを利用したプロジェクトでrspecでテストを実行したところ、エラーが発生したため、その対処法を書いてみます。

    環境

    • OS : Mac OS X 10.5.8
    • Rails : 2.2.3
    • MySQL : mysql5 @5.0.45_0+innodb+senna+server+utf8(MacPorts)

    対象となるテーブルのマイグレーションは

    
    class CreateSearches < ActiveRecord::Migration
      def self.up
        create_table :searches, :options => "ENGINE = MYISAM" do |t|
          t.text     :description
          t.timestamps
        end
        add_index :searches, [:description], :fulltext => true
      end
    
      def self.down
        drop_table :searches
      end
    end
    

    だいたいこんな感じです。(この記事用に想定しているテーブルです。実際にこのテーブルでは試してません.)

    今回のプロジェクトでMySQL+Sennaによる全文検索テーブルを利用しているのですが、いざrspecでテストを流してみると以下のようなエラーが発生しました。(実際にこのテーブルでは試してません.)

    
    $ rake spec
    rake aborted!
    Mysql::Error: The used table type doesn't support FULLTEXT indexes: CREATE FULLTEXT INDEX  `index_searches_on_description`  ON searches (`description`)
    
    (See full trace by running task with --trace)
    

    原因は、まだ開発初期段階でmigrationファイルがいたずらに増えるのがイヤで

    
    $rake db:migrate:reset RAILS_ENV=test
    

    などでテーブルを再生成していたのですが、このrakeコマンドはテーブルのスキーマ情報をダンプ、ロードして作り直しているのですが、その際にテーブルのengineを意識して作り直していないことです。

    したがって、ダンプする際に、engineオプションも吐き出すようにすれば良さそうです。

    そこで力技ですが、以下のパッチ的なものを書いてみました。
    今のところうまく通っています。

    要は30〜33行目でengineタイプがMyISAMの時にその情報もダンプに出力するように、activerecord-2.2.3/lib/active_record/schema_dumper.rbのtableメソッドを書き直しているだけです。

    このファイルをconfig/initializers直下におけば、毎回ロードされて、正しくテーブルが作り直され、spec(テスト)が通るようになります。
    全文検索云々ではなく、MyIASMを利用している環境でエラーが発生している場合は、お試しください。

    そもそも、この状況って皆さんは遭遇してなかったりしないのですかね?
    バグじゃないのかと思ったりしたのですが。。。
    もし、この状況について、他に簡単な方法などをご存知の方やそもそも私の認識が間違っていましたら、ご連絡いただければと思います。