Как проверить тип базы данных в миграции Rails?

У меня есть следующая миграция, и я хочу, чтобы проверить, является ли текущая база данных, относящаяся к среде, базой данных mysql. Если это mysql, то я хочу выполнить SQL, специфичный для базы данных.

Как мне это сделать?

class AddUsersFb < ActiveRecord::Migration

  def self.up
    add_column :users, :fb_user_id, :integer
    add_column :users, :email_hash, :string
    #if mysql
    #execute("alter table users modify fb_user_id bigint")
  end

  def self.down
    remove_column :users, :fb_user_id
    remove_column :users, :email_hash
  end

end
40
27 окт. '09 в 6:22
источник поделиться
5 ответов

ActiveRecord::Base.connection предоставит вам все, что вам когда-либо хотелось узнать о соединении с базой данных, установленном boot.rb и environment.rb

ActiveRecord::Base.connection возвращает много информации. Итак, вы должны точно знать, что вы ищете.

Как указывает Марсель,

ActiveRecord::Base.connection.instance_of? 
  ActiveRecord::ConnectionAdapters::MysqlAdapter 

вероятно, лучший метод определения, если ваша база данных MySQL.

Несмотря на то, что я полагаюсь на внутреннюю информацию, которая может меняться между версией ActiveRecord, я предпочитаю делать это следующим образом:

ActiveRecord::Base.connection.instance_values["config"][:adapter] == "mysql"
36
27 окт. '09 в 6:38
источник

Еще более короткий вызов

ActiveRecord::Base.connection.adapter_name == 'MySQL'
55
29 марта '10 в 11:59
источник

В AbstractAdapter есть adapter_name, и это происходит с Rails2.

Таким образом, легче использовать в миграции следующим образом:

adapter_type = connection.adapter_name.downcase.to_sym
case adapter_type
when :mysql
  # do the MySQL part
when :sqlite
  # do the SQLite3 part
when :postgresql
  # etc.
else
  raise NotImplementedError, "Unknown adapter type '#{adapter_type}'"
end
25
14 апр. '11 в 18:51
источник

В Rails 3 (возможно, раньше, но я использую Rails 3 в настоящее время) с помощью ActiveRecord:: ConnectionAdapters:: MysqlAdapter - это плохой способ обойти это, поскольку он инициализируется только в том случае, если используемым адаптером базы данных является MySQL. Даже если у вас установлен MySQL gem, если это не ваш тип соединения, вызывающий wil сбой:

Loading development environment (Rails 3.0.3)
>> ActiveRecord::Base.connection.instance_of? ActiveRecord::ConnectionAdapters::MysqlAdapter
NameError: uninitialized constant ActiveRecord::ConnectionAdapters::MysqlAdapter
from (irb):1

Итак, я бы рекомендовал ответить stasl и использовать свойство adapter_name для соединения.

8
21 янв. '11 в 22:21
источник

Это может помочь:

execute 'alter table users modify fb_user_id bigint WHERE USER() = "mysqluser";'

-4
27 окт. '09 в 6:37
источник

Посмотрите другие вопросы по меткам или Задайте вопрос