mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

Ruby - undefined method `connect' for Mysql:Class!

[ プログラミング ] [ MySQL, Ruby ]

こんばんは。

Ruby に Gem パッケージ mysql をインストール済みなのに、connect 時に以下のようなエラーが発生します。

1
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 コマンドが存在するか確認する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 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 をインストールする。

1
2
3
4
5
6
# 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 コマンドが存在するか確認する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 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