2010-04-07 12 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 

erreur je suis geting est:Problèmes lors de la connexion à MySQL en utilisant Ruby

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

EDIT valeur de retour de 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?"] 

valeur de retour de Mysql. méthodes (false)

est [] ... tableau blanc

EDIT2

de fichier 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

Quelle est la valeur de retour de Mysql.methods (false)? –

+0

@dominikh pls chk le texte ci-dessous éditer .. –

+0

avez-vous, par hasard, un fichier mysql.rb quelque part dans votre projet qui contient une classe Mysql vide? –

Répondre

7

J'ai eu ce même problème et résolu de cette façon:

  1. assurez-vous que vous avez installé uniquement la gemme ruby-mys ql et pas la gem mysql. Pour moi, maintenant:

    $ liste de gemmes --local | grep mysql

    rubis mysql (2.9.2)

  2. Si ce n'est pas le cas, désinstallez

    $ sudo gem désinstaller mysql

(je désinstallée chaque bijou avec MySQL dans son nom) , puis réinstallé ruby-mysql.

Dans mon cas, parce que je l'ai installé MySQL dans un disque USB la commande d'installation était:

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 

(et j'utilisais le binaire 32bits pour MacOs, ne sais pas si cela vaut pour vous)

Enfin, mon programme de test rubis était

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 Pour moi maintenant son: - mysql (2.8.1) –

+0

+1 cela résout en fait le problème. – pilcrow

1

réponse courte:

  1. Supprimer mysql-ruby
  2. Reconstruire mysql-ruby
  3. Réinstaller mysql-ruby.

réponse alternative

  1. Retirez mysql-ruby
  2. Installation ruby-mysql
    Le protocole client pur MySQL rubis.

plus long Explication:

Ce juste arrivé à moi. Mon 2.8.1 mysql-ruby liaisons avaient été construits contre libmysqlclient.so.15, et a bien fonctionné jusqu'à ce que j'ai mis à jour mon installation MySQL et remplacé cette bibliothèque cliente avec .so.16. Reconstruire a résolu ce problème.

La gemme tierce que vous avez utilisée (je l'ai utilisée aussi) présente une logique erronée dans le fichier mysql.rb qu'elle fournit pour intercepter une erreur sur les systèmes Windows. Notez que dans l'extrait que vous avez posté, ce fichier mysql.rb fait et non re-soulève le LoadError sur des plates-formes non-Windows. Bummer.

Modifier

Je contacté l'auteur gemspec, et il a corrected the error! (2010-05-25) Avec de la chance, personne d'autre ne sera déconcerté par cet échec silencieux.