首页 文章

如何在Rails迁移中检查数据库类型?

提问于
浏览
41

我有以下迁移,我希望能够检查与环境相关的当前数据库是否是一个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 回答

  • 25

    ActiveRecord::Base.connection 将为您提供有关 boot.rbenvironment.rb Build 的数据库连接的所有信息 .

    ActiveRecord::Base.connection 返回了很多信息 . 所以你正在寻找 .

    正如马塞尔指出:

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

    可能是确定您的数据库MySQL的最佳方法 .

    尽管依赖于可能在 ActiveRecord 版本之间发生变化的内部信息,我更喜欢这样做:

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

    更短的电话

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

    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
    
  • 8

    在Rails 3中,(可能更早,但我目前正在使用Rails 3)使用ActiveRecord :: ConnectionAdapters :: MysqlAdapter是一种很糟糕的方式,因为只有在使用的数据库适配器是MySQL时才会初始化它 . 即使您安装了MySQL gem,如果它不是您的连接类型,那么该调用将失败:

    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属性 .

  • -4

    这可能有所帮助:

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

相关问题