Ruby - undefined method `connect’ for Mysql:Class!
Updated:
Ruby に Gem パッケージ mysql をインストール済みなのに、connect 時に以下のようなエラーが発生します。
undefined method `connect' for Mysql:Class
環境によって、発生したり発生しなかったりします。
以下、対策方法メモです。
備忘録
0. 前提条件
当方の場合、以下のような環境でこのようなエラーが発生しました。
- Scientific Linux 6.2 (x86_64)
- ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux] (ソースからコンパイルしてインストールした)
- Gem パッケージ mysql 2.8.1
ちなみに、以下のような環境では問題なかった。
- CentOS 6.3 (i386)
- ruby 1.9.3p194 (2012-04-20 revision 35410) [i686-linux] (ソースからコンパイルしてインストールした)
- Gem パッケージ mysql 2.8.1
1. connect メソッドの存在確認
以下のようにして、connect コマンドが存在するか確認する。
# irb
irb(main):001:0> require 'mysql'
=> true
irb(main):002:0> Mysql.methods
=> [:allocate, :new, :superclass, :freeze, :===, :==, :<=>, :<, :<=, :>, :>=, :to_s, :included_modules,
:include?, :name, :ancestors, :instance_methods, :public_instance_methods, :protected_instance_methods,
:private_instance_methods, :constants, :const_get, :const_set, :const_defined?, :const_missing,
:class_variables, :remove_class_variable, :class_variable_get, :class_variable_set,
:class_variable_defined?, :public_constant, :private_constant, :module_exec, :class_exec, :module_eval,
:class_eval, :method_defined?, :public_method_defined?, :private_method_defined?,
:protected_method_defined?, :public_class_method, :private_class_method, :autoload, :autoload?,
:instance_method, :public_instance_method, :nil?, :=~, :!~, :eql?, :hash, :class, :singleton_class,
:clone, :dup, :initialize_dup, :initialize_clone, :taint, :tainted?, :untaint, :untrust, :untrusted?,
:trust, :frozen?, :inspect, :methods, :singleton_methods, :protected_methods, :private_methods,
:public_methods, :instance_variables, :instance_variable_get, :instance_variable_set,
:instance_variable_defined?, :instance_of?, :kind_of?, :is_a?, :tap, :send, :public_send, :respond_to?,
:respond_to_missing?, :extend, :display, :method, :public_method, :define_singleton_method, :object_id,
:to_enum, :enum_for, :equal?, :!, :!=, :instance_eval, :instance_exec, :__send__, :__id__]
connect メソッドがありません。
2. Gem パッケージ ruby-mysql の導入
詳細は不明だが、mysql の代わりに ruby-mysql を導入すればよいようです。 Gem パッケージ mysql をアンインストールして、ruby-mysql をインストールする。
# gem list | grep mysql
mysql (2.8.1)
# gem uninstall mysql
# gem install ruby-mysql
# gem list | grep mysql
ruby-mysql (2.9.10)
3. 再度 connect メソッドの存在確認
以下のようにして、connect コマンドが存在するか確認する。
# irb
irb(main):001:0> require 'mysql'
=> true
irb(main):002:0> Mysql.methods
=> [:init, :new, :real_connect, :connect, :escape_string, :quote, :client_info, :get_client_info,
:client_version, :get_client_version, :allocate, :superclass, :freeze, :===, :==, :<=>, :<, :<=, :>,
:>=, :to_s, :included_modules, :include?, :name, :ancestors, :instance_methods,
:public_instance_methods, :protected_instance_methods, :private_instance_methods, :constants,
:const_get, :const_set, :const_defined?, :const_missing, :class_variables, :remove_class_variable,
:class_variable_get, :class_variable_set, :class_variable_defined?, :public_constant, :private_constant,
:module_exec, :class_exec, :module_eval, :class_eval, :method_defined?, :public_method_defined?,
:private_method_defined?, :protected_method_defined?, :public_class_method, :private_class_method,
:autoload, :autoload?, :instance_method, :public_instance_method, :nil?, :=~, :!~, :eql?, :hash, :class,
:singleton_class, :clone, :dup, :initialize_dup, :initialize_clone, :taint, :tainted?, :untaint,
:untrust, :untrusted?, :trust, :frozen?, :inspect, :methods, :singleton_methods, :protected_methods,
:private_methods, :public_methods, :instance_variables, :instance_variable_get, :instance_variable_set,
:instance_variable_defined?, :instance_of?, :kind_of?, :is_a?, :tap, :send, :public_send, :respond_to?,
:respond_to_missing?, :extend, :display, :method, :public_method, :define_singleton_method, :object_id,
:to_enum, :enum_for, :equal?, :!, :!=, :instance_eval, :instance_exec, :__send__, :__id__]
connect メソッドがあります。
これで、connect 時のエラーはなくなりました。 アーキテクチャによって、入るパッケージが異なるように思わせる現象でした。
以上です。
Comments