run remove rails migrations data create column ruby-on-rails ruby migration rails-migrations

ruby-on-rails - remove - rollback migration rails



¿Cómo verifico el tipo de base de datos en una migración de Rails? (5)

En Rails 3, (quizás antes, pero actualmente estoy usando Rails 3) usar ActiveRecord :: ConnectionAdapters :: MysqlAdapter es una manera 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 de 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ía la propiedad adapter_name de la conexión.

Tengo la siguiente migración y quiero poder comprobar 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 para 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


Esto podría ayudar:

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


Hay un adapter_name en AbstractAdapter y está ahí desde Rails2.

Así que 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


Llamada aún más corta

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


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

ActiveRecord::Base.connection devuelve mucha información. Así que tienes que 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 las versiones de ActiveRecord , prefiero hacerlo de esta manera:

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