【问题标题】:Ruby 1.9.2 under RVM and MySQL already initialized constant warningsRVM 和 MySQL 下的 Ruby 1.9.2 已经初始化常量警告
【发布时间】:2010-08-06 17:49:23
【问题描述】:

在 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 的脚本。

尽管捆绑包本身确实加载并且 MySQL 驱动程序确实工作,但大量的警告是通过 Rails 运行的任何东西的前言。通常这是由于 Rails 环境中某处的 mysql gem 的冗余负载造成的。 gem 在 Gemfile 中声明:

gem 'rails', '3.0.0.rc'

gem 'haml'
gem 'sequel'

gem 'mysqlplus'
gem 'mysql'

我想这是 Rails 自动加载器无法理解 Mysql 库已经加载,并再次加载它。有没有简单的方法来解决这个问题?

更新:

加载 mysqlmysqlplus 但不能同时加载两者,否则您会收到这样的警告。 mysqlplus 包含 mysql 的所有功能,并且是 Sequel 的依赖项。

【问题讨论】:

  • 我已将范围缩小到 mysqlplus gem,但无法确定原因。

标签: ruby-on-rails ruby-1.9 bundler sql


【解决方案1】:

您需要 mysqlplus gem 吗?我正在使用只有 mysql 2.8.1 的 Rails 3:

gem 'mysql', '2.8.1'

虽然我没有使用过mysqlplus,但我猜测它设置了您在警告中看到的常量,然后mysql gem 在加载时再次设置这些常量。

更新:改用 mysql2

#gem 'mysql', '2.8.1' 宝石'mysql2'

您还需要在 database.yml 中更新您的数据库适配器:

发展: #适配器:mysql 适配器:mysql2 数据库:somedatabase_development

【讨论】:

  • 经过更多研究,我在 wycat 的博客中发现了这一点:“我们为 DataMapper 构建的所有数据对象驱动程序在进入其 C 代码的阻塞区域时都会正确地导致上下文切换。mysqlplus gem , 于 2009 年 3 月发布,旨在替代 mysql gem,但解决了这个问题。由 Brian Lopez 编写的新 mysql2 gem 是旧 gem 的直接替代,也正确处理编码在 Ruby 1.9 中,并且是 Rails 中新的默认 MySQL 驱动程序。”
  • gem 'mysql2' #in 你的 Gemfile
  • 适配器:mysql2 #in database.yml
  • 诀窍是你加载 either mysqlmysqlplus 但不能同时加载。它是替代品有助于解释原因。
  • 为了清楚起见,我在这里谈论的是 3 种不同的宝石。 mysql、mysqlplus 和 mysql2(mysql v2.8.1 与 mysql2 不同)。根据 rails 核心团队,mysql2 是 Rails 3 的首选 gem。所以你只需要'mysql2'而不是使用'mysql and mysqlplus'或'mysql'
猜你喜欢
  • 2011-08-20
  • 1970-01-01
  • 2011-08-29
  • 2011-01-02
  • 2011-11-29
  • 1970-01-01
  • 2012-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多