在RVM下使用Ruby 1.9.2.rc2运行Rails 3 RC时,我不断从MySQL驱动程序包中获得大量错误,如下所示:
/opt/local/rvm/gems/ruby-1.9.2-rc2/gems/mysql-2.8.1/lib/mysql_api.bundle: warning: already initialized constant MysqlRes
/opt/local/rvm/gems/ruby-1.9.2-rc2/gems/mysql-2.8.1/lib/mysql_api.bundle: warning: already initialized constant MysqlField
/opt/local/rvm/gems/ruby-1.9.2-rc2/gems/mysql-2.8.1/lib/mysql_api.bundle: warning: already initialized constant MysqlError
/opt/local/rvm/gems/ruby-1.9.2-rc2/gems/mysql-2.8.1/lib/mysql_api.bundle: warning: already initialized constant VERSION
/opt/local/rvm/gems/ruby-1.9.2-rc2/gems/mysql-2.8.1/lib/mysql_api.bundle: warning: already initialized constant OPT_CONNECT_TIMEOUT
/opt/local/rvm/gems/ruby-1.9.2-rc2/gems/mysql-2.8.1/lib/mysql_api.bundle: warning: already initialized constant OPT_COMPRESS
/opt/local/rvm/gems/ruby-1.9.2-rc2/gems/mysql-2.8.1/lib/mysql_api.bundle: warning: already initialized constant OPT_NAMED_PIPE
/opt/local/rvm/gems/ruby-1.9.2-rc2/gems/mysql-2.8.1/lib/mysql_api.bundle: warning: already initialized constant INIT_COMMAND
这显示在rails console
和单元测试中,任何需要完整Rails堆栈的内容,但不是直接在同一环境中使用Sequel的脚本。
虽然bundle本身确实加载并且MySQL驱动程序确实有效,但是这一大堆警告预示着任何通过Rails运行的东西。通常这是由于Rails环境中某处mysql
gem的冗余加载造成的。 gem在Gemfile中声明:
gem 'rails', '3.0.0.rc'
gem 'haml'
gem 'sequel'
gem 'mysqlplus'
gem 'mysql'
我认为这是Rails自动加载器无法理解已加载的Mysql库,并再次加载它。有没有一种简单的方法来解决这个问题?
更新
同时加载mysql
或mysqlplus
但不能同时加载两者,否则您会收到类似警告。 mysqlplus
包含mysql
的所有功能,并且是续集的依赖。
答案 0 :(得分:1)
你需要mysqlplus宝石吗?我只使用Rails 3和mysql 2.8.1:
gem 'mysql', '2.8.1'
虽然我没有使用mysqlplus,但我猜它会在警告中设置你看到的常量,然后mysql gem在加载时再次设置这些常量。
更新:改用mysql2
#gem 'mysql', '2.8.1' gem 'mysql2'
您还需要在database.yml中更新数据库适配器:
development: #adapter: mysql adapter: mysql2 database: somedatabase_development