Проблемы при подключении к mysql с использованием ruby - PullRequest
2 голосов
/ 07 апреля 2010
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

ошибка, которую я получаю:

    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?"]

returnзначение Mysql.methods (false)

равно [] ... пустой массив

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

Ответы [ 2 ]

7 голосов
/ 03 мая 2010

У меня была такая же проблема, и я решил ее следующим образом:

  1. убедитесь, что вы установили только гем ruby-mysql, а не гем mysql.Для меня сейчас :

    $ список драгоценных камней --local |grep mysql

    ruby-mysql (2.9.2)

  2. Если это не так, удалите

    $ sudo gem uninstall mysql

(я удалил каждый драгоценный камень с именем mysql), а затем переустановил ruby-mysql.

В моем случае, поскольку у меня установлен mysql на USB-диске, команда установки была:

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

(и я использовал 32-битный бинарный файл для MacOs, не знаю, подходит ли он для вас)

Наконец, моя тестовая программа ruby ​​была

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
1 голос
/ 25 мая 2010

Краткий ответ:

  1. Удалить mysql-ruby
  2. Перестроить mysql-ruby
  3. Переустановите mysql-ruby.

Альтернативный ответ

  1. Удалить mysql-ruby
  2. Установка ruby-mysql
    Чистый ruby ​​клиент протокола MySQL.

Более длинное объяснение:

Это только что случилось со мной. Мои привязки 2.8.1 mysql-ruby были построены против libmysqlclient.so.15 и работали нормально, пока я не обновил установку MySQL и не заменил эту клиентскую библиотеку на .so.16. Перестройка решила эту проблему.

Используемый вами сторонний гем (я тоже его использовал) вводит некорректную логику в файл mysql.rb, который он предоставляет, чтобы перехватить ошибку в системах Windows. Обратите внимание, что в отрывке, который вы опубликовали, этот mysql.rb файл не повторно поднимает LoadError на платформах, отличных от Windows. Облом.

Редактировать

Я связался с автором gemspec, и он исправил ошибку ! (2010-05-25) Если повезет, этот молчаливый сбой больше никого не смущает.

...