我正在将一个非常大的 Rails 2.3 应用程序从 ruby 1.8 迁移到 1.9。在此过程中,我遇到了一些数据库编码问题,似乎只能通过从旧ruby-mysql
gem 迁移到mysql2
.
这对于所有ActiveRecord::Base
ORM 之类的查询(@users = User.find(:all, :conditions => {...})
等)都可以正常工作,但是该应用程序还严重依赖于直接查询数据库以解决一些与性能相关的问题。看到这样的东西很常见:
ActiveRecord::Base.connection.execute(optimized_sql).each_hash do |row|
# do some stuff with row
end
或者
# for specific connections (different servers, etc)
client = Mysql.real_connect(host, username, password, schema)
client.query(tweaked_sql).each_hash do |row|
# do some stuff with row
end
或者
# for batch inserts
client.autocommit(false)
insert_list.each { |insert| client.query(insert) }
client.commit
我应该注意,这个查询主要是在为此编写的指定类文件中完成的,所以不是在控制器、模型等中完成 - 但主要是针对app_root/lib/
. 我似乎也找不到我在旧宝石中使用的东西的许多等效功能。一个很好的例子是#autocommit
like 方法(启用批量查询,如多个 INSERT)。
我想通过使用这两个 gem 来平滑过渡 -mysql2
对于所有ActiveRecord
东西,以及ruby-mysql
直接客户端连接到数据库。但是,当我将两者都包含在我的应用程序的 Gemfile 中时,Rails 似乎默认为其中之一。有没有办法将 Gemfile 配置为仅ruby-mysql
在应用加载时包含但不自动需要它?
如何确保两者都存在,并且仅require 'mysql'
在我严格想要使用旧 gem 的文件中使用?我应该采取其他方法吗?一次性转换整个应用程序是一个相当大的风险,我想让我的团队有一些时间来适应和转换旧代码从 Mysql 到 Mysql2。
谢谢。