Как проверить тип базы данных в миграции 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
Ответы
Ответ 1
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"
Ответ 2
Еще более короткий вызов
ActiveRecord::Base.connection.adapter_name == 'MySQL'
Ответ 3
В 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
Ответ 4
В 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 для соединения.
Ответ 5
Это может помочь:
execute 'alter table users modify fb_user_id bigint WHERE USER() = "mysqluser";'