Как проверить тип базы данных в Rails Migration? - PullRequest
42 голосов
/ 27 октября 2009

У меня есть следующая миграция, и я хочу иметь возможность проверить, является ли текущая база данных, связанная со средой, базой данных 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

Ответы [ 5 ]

57 голосов
/ 29 марта 2010

Еще короче звонок

ActiveRecord::Base.connection.adapter_name == 'MySQL'
39 голосов
/ 27 октября 2009

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"
25 голосов
/ 14 апреля 2011

Существует adapter_name в AbstractAdapter, и это существует с 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
8 голосов
/ 21 января 2011

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

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 соединения.

0 голосов
/ 27 октября 2009

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

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

...