Ruby / Rails - Работа с ruby-mysql и mysql2 - PullRequest
0 голосов
/ 15 февраля 2012

Я перевожу очень большое приложение Rails 2.3 с ruby ​​1.8 на 1.9. Попутно у меня были некоторые проблемы с кодировкой базы данных, которые, казалось, могли быть решены только путем перехода от старого ruby-mysql гема к 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

OR

# 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

OR

# for batch inserts
client.autocommit(false)
insert_list.each { |insert| client.query(insert) }
client.commit

Я должен отметить, что этот запрос в основном выполняется в специально предназначенных для этого файлах классов, а не в контроллерах, моделях и т. П., Но в основном для вещей, находящихся под app_root/lib/. Я также не могу найти много эквивалентных вещей, которые я использовал в старом драгоценном камне. Хорошим примером является #autocommit -подобный метод (для включения пакетных запросов, например, нескольких INSERT).

Я бы хотел сгладить переход, используя оба гема - mysql2 для всех ActiveRecord вещей и ruby-mysql для прямого подключения клиента к базе данных. Тем не менее, когда я включаю оба в Gemfile моего приложения, Rails кажется по умолчанию для одного или другого. Есть ли способ настроить Gemfile, чтобы он включал только ruby-mysql, но не требовал его автоматически при загрузке приложения?

Как я могу убедиться, что оба присутствуют, и использовать require 'mysql' только в тех файлах, где я строго хочу использовать старый гем? Есть ли какой-то другой подход, который я должен использовать? Преобразование всего приложения в одно движение - довольно большой риск, и я хотел бы дать возможность моей команде некоторое время адаптировать и перенести старый код из Mysql в Mysql2.

спасибо.

1 Ответ

0 голосов
/ 15 февраля 2012

Хотя рельсы на самом деле не созданы для этого, вы определенно можете

http://robbyonrails.com/articles/2007/10/05/multiple-database-connections-in-ruby-on-rails

...