2010-04-07 16 views
2
require 'rubygems' 
require 'mysql' 
db = Mysql.connect('localhost', 'root', '', 'mohit') 
//db.rb:4: undefined method `connect' for Mysql:Class (NoMethodError) 
//undefined method `real_connect' for Mysql:Class (NoMethodError) 
db.query("CREATE TABLE people (id integer primary key, name varchar(50), age integer)") 
db.query("INSERT INTO people (name, age) VALUES('Chris', 25)") 
begin 
query = db.query('SELECT * FROM people') 
puts "There were #{query.num_rows} rows returned" 
    query.each_hash do |h| 
    puts h.inspect 
end 
rescue 
puts db.errno 
puts db.error 
end 

错误我正在歌厅是:问题,同时连接到MySQL使用Ruby

undefined method `connect' for Mysql:Class (NoMethodError) 
        OR 
    undefined method `real_connect' for Mysql:Class (NoMethodError) 

编辑Mysql.methods的 返回值

 ["private_class_method", "inspect", "name", "tap", "clone", "public_methods", "object_id", "__send__", "method_defined?", "instance_variable_defined?", "equal?", "freeze", "extend", "send", "const_defined?", "methods", "ancestors", "module_eval", "instance_method", "hash", "autoload?", "dup", "to_enum", "instance_methods", "public_method_defined?", "instance_variables", "class_variable_defined?", "eql?", "constants", "id", "instance_eval", "singleton_methods", "module_exec", "const_missing", "taint", "instance_variable_get", "frozen?", "enum_for", "private_method_defined?", "public_instance_methods", "display", "instance_of?", "superclass", "method", "to_a", "included_modules", "const_get", "instance_exec", "type", "<", "protected_methods", "<=>", "class_eval", "==", "class_variables", ">", "===", "instance_variable_set", "protected_instance_methods", "protected_method_defined?", "respond_to?", "kind_of?", ">=", "public_class_method", "to_s", "<=", "const_set", "allocate", "class", "new", "private_methods", "=~", "tainted?", "__id__", "class_exec", "autoload", "untaint", "nil?", "private_instance_methods", "include?", "is_a?"] 

的Mysql的返回值。方法(假)

是[] ...空白阵列

EDIT2

mysql.rb文件

# support multiple ruby version (fat binaries under windows) 
begin 
    require 'mysql_api' 
    rescue LoadError 
    if RUBY_PLATFORM =~ /mingw|mswin/ then 
RUBY_VERSION =~ /(\d+.\d+)/ 
require "#{$1}/mysql_api" 
end 
end 

# define version string to be used internally for the Gem by Hoe. 
    class Mysql 
    module GemVersion 
    VERSION = '2.8.1' 
    end 
    end 
+0

Mysql.methods(false)的返回值是什么? – 2010-04-07 11:27:08

+0

@dominikh请在下面的文本编辑.. – 2010-04-07 12:29:30

+0

你是否偶然在你的项目中有一个mysql.rb文件,它包含一个空的Mysql类? – 2010-04-07 12:39:48

回答

7

我有这个同样的问题,解决了这个办法:

  1. 确保你只安装了宝石ruby-mys ql 而不是gem mysql。对我而言,现在

    $ gem list --local | grep的MySQL的

    红宝石的MySQL(2.9.2)

  2. 如果情况并非如此,卸载

    $ sudo的宝石卸载MySQL的

(我卸载每个宝石与MySQL在它的名字) ,然后重新安装ruby-mysql。

在我的情况,因为我的mysql安装在U盘 安装命令是:

sudo env ARCHFLAGS="-arch i386" gem install ruby-mysql -- 

--with-mysql-config=/Volumes/usb/opt/bin/osx/mysql/bin/mysql_config 

--with-mysql-lib=/Volumes/usb/opt/bin/osx/mysql/lib/  

--with-mysql-dir=/Volumes/usb/opt/bin/osx/mysql 

(我是使用针对Mac系统的32位二进制文​​件,不知道这是否适用于你)

最后,我的红宝石测试程序是

require 'rubygems' 
require 'mysql' 


dbh = Mysql.real_connect('localhost', 'root', 'your password', 'TEST') 


res = dbh.query("select * from Persons;"); 

puts res.class 

res.each do |row| 
    puts row.join(" ") 
end 
+0

@ cibercitizen1 对我来说现在它的: - mysql(2.8.1) – 2010-05-03 11:09:32

+0

+1这实际上,这确实解决了问题。 – pilcrow 2010-05-25 05:07:21

1

简短的回答:

  1. 删除mysql-ruby
  2. 重建mysql-ruby
  3. 重新安装mysql-ruby

替代答案

  1. 删除mysql-ruby
  2. 安装ruby-mysql
    纯红宝石MySQL协议客户端。

更详细的解释:

这只是发生在我身上。我的2.8.1 mysql-ruby绑定已针对libmysqlclient.so.15构建,并且工作良好,直到我升级了我的MySQL安装并用.so.16替换了该客户端库。重建解决了这个问题。

您使用的第三方gem(我也使用过它)在其提供的mysql.rb文件中引入了错误的逻辑,以在Windows系统上捕获错误。请注意,在您发布的摘录中,此mysql.rb文件确实是而非在非Windows平台上重新提高了LoadError。游民。

编辑

我联系了gemspec笔者,他有corrected the error! (2010-05-25)幸运的是,没有人会因这种沉默的失败而感到困惑。