¿Cómo verifico el tipo de base de datos en una migración de Rails?
-
06-07-2019 - |
Pregunta
Tengo la siguiente migración y quiero 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 hago 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
Solución
ActiveRecord :: Base.connection
le proporcionará todo lo que siempre quiso saber sobre la conexión a la base de datos establecida por boot.rb
y environment.rb
ActiveRecord :: Base.connection
devuelve mucha información. Así que 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 depender de información interna que podría cambiar entre el lanzamiento de ActiveRecord
, prefiero hacerlo de esta manera:
ActiveRecord::Base.connection.instance_values["config"][:adapter] == "mysql"
Otros consejos
Llamada aún más corta
ActiveRecord::Base.connection.adapter_name == 'MySQL'
Hay un 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
En Rails 3, (tal vez antes, pero estoy usando Rails 3 actualmente) usar 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 tiene instalada la gema MySQL, si no es su tipo de conexión, esa llamada 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, recomendaría la respuesta de stasl y usar la propiedad del nombre del adaptador de la conexión.
Esto podría ayudar:
execute 'alter table usuarios modifican fb_user_id bigint WHERE USER () = " mysqluser " ;;'