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
このバージョンが開発環境としていいんだか悪いんだか判断つきません。。