2009-10-27 10 views
41

Tengo la siguiente migración y deseo poder verificar si la base de datos actual relacionada con el entorno es una base de datos mysql. Si es mysql, entonces quiero ejecutar el SQL que es específico de la base de datos.¿Cómo verifico el tipo de base de datos en una migración de Rails?

¿Cómo puedo hacer esto?

 
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 

Respuesta

37

ActiveRecord::Base.connection le proporcionará todo lo que siempre quiso saber acerca de la conexión de base de datos establecida por boot.rb y environment.rb

ActiveRecord::Base.connection devuelve una gran cantidad de información . Entonces debes saber exactamente lo que estás buscando.

Como señala Marcel:

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

es probablemente el mejor método para determinar si su base de datos MySQL.

A pesar de confiar en la información interna que podría cambiar entre ActiveRecord liberación, prefiero hacerlo de esta manera:

ActiveRecord::Base.connection.instance_values["config"][:adapter] == "mysql" 
+1

'ActiveRecord :: Base.connection.instance_of? ActiveRecord :: ConnectionAdapters :: MysqlAdapter' debería resolverlo. –

-4

Esto podría ayudar:

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

+1

No funcionará cuando el usuario es diferente y no funcionará ninguna base de datos donde 'USUARIO()' no está definida la función, por p.ej SQLite. –

55

Aún más llamada más corta

ActiveRecord::Base.connection.adapter_name == 'MySQL' 
+6

Estoy usando la gema mysql2, y sospecho que algunos otros podrían en este punto, entonces uso lo siguiente: 'ActiveRecord :: Base.connection.adapter_name.downcase.starts_with? 'mysql'' – bensnider

+5

'ActiveRecord :: Base.connection.adapter_name ==" Mysql2 "' funcionó para mí con Rails 4. – Jason

8

En Rails 3, (tal vez antes, pero Estoy usando Rails 3 actualmente) usando ActiveRecord :: ConnectionAdapters :: MysqlAdapter es una forma pobre de hacerlo, ya que solo se inicializa si el adaptador de base de datos en uso es MySQL. Incluso si usted tiene la gema MySQL instalado, si no es el tipo de conexión, esa llamada Wil fallar:

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

Por lo tanto, me gustaría recomendar la respuesta de stasl y usar la propiedad ADAPTER_NAME de la conexión.

25

Hay adapter_name en AbstractAdapter y eso está allí desde Rails2.

Por lo tanto, es más fácil de usar en la migración de esta manera:

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 
+2

Esto no funcionará con la gema mysql2; puede simplemente editar la línea para que sea '' 'cuando : mysql,: mysql2'''. – mrm

+0

Su respuesta es más completa y limpia. Gracias. – cassioscabral

+0

Para postgres: ' def is_postgres? name = ActiveRecord :: Base.connection.adapter_name.downcase name = ~/postgres/ end ' – Blaskovicz

Cuestiones relacionadas