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

我只是试图获得在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.) 

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

 gem 'mysql2', '0.3.2' 

在我的gemfile中。 有些post建议使用 –

 gem 'mysql2', '~> 0.3' 

但这给我带来了同样的错误。 gem安装在 –

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

有人建议我再次在我的gem文件中切换该行,这次是 –

 gem 'mysql2', '< 0.3' 

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

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

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

 class CreatePlaces  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) 

但是当我真的试图在地方做一个发现或任何事情时,我得到以下错误 –

 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 `' from script/rails:6:in `require' from script/rails:6:in `' 

有人有主意吗? 我现在已经挖了18个小时,只是在圈子里跑。

谢谢, – 马克

Active Record对mysql2哪个版本兼容有自己的要求。 这是Rails 3.1 的代码行 。 您必须使用满足这些要求的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 

这也让我拉出我的头发。 只有合理的解决方案才能切换到mysql2 gem的master分支。

gem’mysql2′,: git =>’git://github.com/brianmario/mysql2.git’

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

我知道这是一个非常古老的主题,但因为它仍然出现在谷歌的结果中,我首先得到了一个结果,但是我必须在新版本的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不能使用mysql2 0.5.x.实际代码可以正常工作,但Rails 4有一个版本限制,以防止使用mysql2 0.5.x.这是故意的,因为它允许将来的更改API没有在没有准备好使用新API的情况下无声地冒险使用它们。版本号也没什么神奇之处 - 完全巧合的是Rails 4使用mysql2 0.4而Rails 5将能够使用mysql2 0.4或0.5。 “

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

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

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