読者です 読者をやめる 読者になる 読者になる

Railsでrake db:migrate実行時の「uninitialized constant MysqlCompat::MysqlRes」エラーについて

この件、解決するのに正直時間が掛かったので、皆さんのためになればと。

まずは、下記のイギリス人のブログが参考になりました。
http://www.pixellatedvisions.com/2011/03/13/fixing-mysql-and-rubygem-errors-on-a-new-rails-2-3-8-install

ざっくり翻訳すると、まずは、

file `which ruby`
file `which mysql`

を実行し、rubyとmysqlが64bit版でインストールされていることを確認します。

次にRailsで使用するmysqlのライブラリをgemでインストールします。

sudo env ARCHFLAGS="-arch x86_64" gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config

これで解決すると紹介しているページが多いですが、私は駄目でした。。

そこで、先ほど紹介したブログの最後にある

export DYLD_LIBRARY_PATH=/usr/local/mysql/lib

を実行し、再度、rake db:migrateを実行したところエラーの内容に変化がありました。↓

Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

どうもソケットの内容が怪しいようです。
Railsのプロジェクトフォルダにある/config/database.yml
を参照して見て下さい。

socket: /var/lib/mysql/mysql.sock

のような記述がないでしょうか。あれば、コメント化することでrake db:migrateを実行しても
エラーが出なくなるはずです。

なお、私の場合、mysql.sockは、/private/tmp/内に存在しておりました。
よって、上記database.ymlを

socket: /private/tmp/mysql.sock

と書き直してみたところ、同様にエラーが出なくなりました。

但し、この対応だと、一度ターミナルとの接続を切るとDYLD_LIBRARY_PATHの値もクリアされますので、

Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

当然ですが、上記エラーが再発します。

そこで、私の場合は、~/.bash_loginへ下記の追加を行いました。
これで常時エラーが出なくなるはずです。
また、DYLD_LIBRARY_PATHに関しては、値をセットするとシステム全般への
影響があるようなので、DYLD_FALLBACK_LIBRARY_PATHへ値をセットしております。

export DYLD_FALLBACK_LIBRARY_PATH=/usr/local/mysql/lib

なお、バージョンは以下の通り。
Ruby 1.8.7、Rails 2.3.11、MySQL 5.5.15
このバージョンが開発環境としていいんだか悪いんだか判断つきません。。