无法激活mysql2(〜> 0.3.6),已经在Rails 3.1中激活了mysql2-0.3.2

时间:2011-07-26 06:15:05

标签: mysql ruby-on-rails rake bundler ruby-on-rails-3.1

我只是试图获得在3.1下运行的rails应用程序的最基本的shell,当我运行bundle exec rake db时,我遇到了这个奇怪的错误:migrate -

Please install the mysql2 adapter: `gem install activerecord-mysql2-adapter` (can't activate mysql2 (~> 0.3.6), already activated mysql2-0.3.2. Make sure all dependencies are added to Gemfile.)

我在这里和其他地方读到的所有帖子都说我应该使用较新的mysql2适配器用于rails 3.1,所以我有 -

gem 'mysql2', '0.3.2'

在我的gemfile中。有些帖子建议使用 -

gem 'mysql2', '~> 0.3'

但是这给我带来了同样的错误。宝石安装在 -

/Users/mark/.rvm/gems/ruby-1.9.2-p180@rails310pre/gems/mysql2-0.3.2

有人建议我再次在我的gemfile中切换该行,这次是 -

gem 'mysql2', '< 0.3'

但是当我这样做时,运行bundle install,然后尝试再次运行迁移,我得到 -

An error has occurred, all later migrations canceled:
undefined method `rows' for nil:NilClass

我的完整迁移文件如下所示 -

class CreatePlaces < ActiveRecord::Migration
  def change
    create_table :places do |t|
      t.string :title
      t.string :meta_description
      t.string :permalink, :limit => 60
      t.string :name, :limit => 60
      t.string :address
      t.string :state, :limit => 2
      t.string :region, :limit => 3
      t.float :latitude
      t.float :longitude
      t.text :description
      t.boolean :active, :default => true

      t.timestamps
    end
    add_index :places, [:permalink, :state, :region, :latitude, :longitude, :active], :name => 'places_index'
  end
end

运行该迁移的完整输出是 -

==  CreatePlaces: migrating ===================================================
-- create_table(:places)
   -> 0.0925s
-- add_index(:places, [:permalink, :state, :region, :latitude, :longitude, :active], {:name=>"places_index"})
   -> 0.1097s
==  CreatePlaces: migrated (0.2023s) ==========================================

rake aborted!
An error has occurred, all later migrations canceled:

undefined method `rows' for nil:NilClass

没有后来的迁移,这是唯一的迁移,因为这是一个我刚刚开始尝试让Rails 3.1正常运行的应用程序。删除数据库并重新创建它会让我到同一个地方。

我可以从控制台访问地方 -

ruby-1.9.2-p180 :001 > Place
   (0.3ms)  SHOW TABLES
   (0.1ms)  SHOW TABLES
   (1.1ms)  describe `places`
 => Place(id: integer, title: string, meta_description: string, permalink: string, name: string, address: string, state: string, region: string, latitude: float, longitude: float, description: text, active: boolean, created_at: datetime, updated_at: datetime) 

但是当我真正尝试在Places上进行查找或任何操作时,我收到以下错误 -

Place.find(:all)
ArgumentError: wrong number of arguments (3 for 2)
    from /Users/mark/.rvm/gems/ruby-1.9.2-p180@rails310pre/gems/mysql2-0.2.7/lib/active_record/connection_adapters/mysql2_adapter.rb:634:in `select'
    from /Users/mark/.rvm/gems/ruby-1.9.2-p180@rails310pre/gems/activerecord-3.1.0.rc5/lib/active_record/connection_adapters/abstract/database_statements.rb:9:in `select_all'
    from /Users/mark/.rvm/gems/ruby-1.9.2-p180@rails310pre/gems/activerecord-3.1.0.rc5/lib/active_record/connection_adapters/abstract/query_cache.rb:62:in `select_all'
    from /Users/mark/.rvm/gems/ruby-1.9.2-p180@rails310pre/gems/activerecord-3.1.0.rc5/lib/active_record/base.rb:470:in `find_by_sql'
    from /Users/mark/.rvm/gems/ruby-1.9.2-p180@rails310pre/gems/activerecord-3.1.0.rc5/lib/active_record/relation.rb:111:in `to_a'
    from /Users/mark/.rvm/gems/ruby-1.9.2-p180@rails310pre/gems/activerecord-3.1.0.rc5/lib/active_record/relation/finder_methods.rb:155:in `all'
    from /Users/mark/.rvm/gems/ruby-1.9.2-p180@rails310pre/gems/activerecord-3.1.0.rc5/lib/active_record/relation/finder_methods.rb:105:in `find'
    from /Users/mark/.rvm/gems/ruby-1.9.2-p180@rails310pre/gems/activerecord-3.1.0.rc5/lib/active_record/base.rb:437:in `find'
    from (irb):2
    from /Users/mark/.rvm/gems/ruby-1.9.2-p180@rails310pre/gems/railties-3.1.0.rc5/lib/rails/commands/console.rb:45:in `start'
    from /Users/mark/.rvm/gems/ruby-1.9.2-p180@rails310pre/gems/railties-3.1.0.rc5/lib/rails/commands/console.rb:8:in `start'
    from /Users/mark/.rvm/gems/ruby-1.9.2-p180@rails310pre/gems/railties-3.1.0.rc5/lib/rails/commands.rb:40:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'

有人有什么想法吗?我现在已经挖了18个小时,只是在圈子里跑。

谢谢, --mark

4 个答案:

答案 0 :(得分:10)

Active Record对mysql2的哪些版本兼容有自己的要求。这是Rails 3.1的line of code。您必须使用满足这些要求的mysql2版本。

  

请安装mysql2适配器:gem install activerecord-mysql2-adapter(无法激活mysql2(〜> 0.3.6),已激活mysql2-0.3.2。确保所有依赖项都已添加到Gemfile中。)

这就是说Rails期望mysql2版本大于0.3.6且小于0.4.0,但发现版本为0.3.2。如果您更改Gemfile以请求此范围内的版本,那么Active Record应该很高兴。也许

gem 'mysql2', '0.3.6'

更改Gemfile后不要忘记更新您的软件包。

bundle update mysql2

答案 1 :(得分:2)

这也让我脱掉了头发。我只能切换到mysql2 gem的主分支。

gem'mysql2',: git =&gt; 'git的://github.com/brianmario/mysql2.git'

在此更新之后,我的Rails 3.1.0.rc5应用程序可以从MySQL开始。 (在这篇文章发布时,最新版本的宝石是0.3.6)

答案 2 :(得分:0)

我知道这是一个非常古老的线程,但是因为它仍然出现在Google结果中,所以它是第一个结果,尽管我会用新版本的Rails来解决它,但我必须对其进行更新。

错误显示为:

Gem::LoadError: Specified 'mysql2' for database adapter, 
but the gem is not loaded. Add `gem 'mysql2'` to your Gemfile 

其次:

Gem::LoadError: can't activate mysql2 (< 0.5, >= 0.3.13), 
already activated mysql2-0.5.2. Make sure all dependencies are 
added to Gemfile.

我已经在Gemfile中添加了gem,如下所示:

group :production do
  gem 'mysql2'
end

,但是我必须对其进行更新,以防止获取错误消息中指示的范围之外的版本。请注意下面的“ <0.5”:

group :production do
  gem 'mysql2', '< 0.5'
end

此外,不同版本的Rails为MySQL gem设置了不同的最小/最大版本限制:

  

来自   https://github.com/brianmario/mysql2/issues/950#issuecomment-376375844

     

“正确,Rails 4.x无法使用mysql20.5.x。实际代码将   工作正常,但Rails 4设有版本限制以防止   使用mysql20.5.x。这是有意的,因为它允许将来进行更改   到API,而不会默默地冒险在旧代码中使用它们   准备使用新的API。也没有什么神奇的   版本号-Rails 4使用的完全是巧合   mysql2 0.4和Rails 5将能够使用mysql2 0.4或0.5。”

答案 3 :(得分:-2)

很老的问题,所以我假设原始海报已经解决了这个问题。但是,如果有人试图解决第一个问题而来这篇文章:

  

请安装mysql2适配器:gem install activerecord-mysql2-adapter(无法激活mysql2(〜> 0.3.6),已激活mysql2-0.3.2。确保所有依赖项都已添加到Gemfile中。)

这很可能是因为您没有通过bundle exec运行迁移。尝试运行bundle exec rake db:migrate