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

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

   def self.down
     remove_column:users,:fb_user_id
     remove_column:users,:email_hash
  结束

结束

ActiveRecord::Base.connection将为您提供关于由boot.rbenvironment.rbbuild立的数据库连接的所有boot.rb

ActiveRecord::Base.connection返回了很多信息。 所以你必须确切地知道你在找什么。

正如Marcel指出的那样:

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

可能是确定你的数据库MySQL的最好方法。

尽pipe依赖于ActiveRecord版本之间可能会改变的内部信息,但我更喜欢这样做:

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

更短的呼叫

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

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 

在使用ActiveRecord :: ConnectionAdapters :: MysqlAdapter的Rails 3中,(可能更早一些,但是我现在使用Rails 3)是一个很糟糕的方法,因为只有在使用的数据库适配器是MySQL的时候才会初始化它。 即使你安装了MySQL gem,如果它不是你的连接types,那么调用失败:

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

所以,我build议stasl的答案,并使用连接的adapter_name属性。

这可能有助于:

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

    Interesting Posts