如何检查在Rails迁移的数据库类型?(How do I check the Database ty

2019-09-01 10:05发布

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

Answer 1:

ActiveRecord::Base.connection将为您提供一切你想了解的有关建立数据库连接boot.rbenvironment.rb

ActiveRecord::Base.connection返回大量的信息。 所以,你要知道你在寻找什么。

马塞尔指出:

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

或许是决定如果你的数据库的MySQL的最佳方法。

尽管依托,可以改变之间的内部信息ActiveRecord发布,我更喜欢做这种方式:

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


Answer 2:

更短的呼叫

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


Answer 3:

有一个adapter_nameAbstractAdapter ,这是因为有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


Answer 4:

在Rails 3,(也许更早,但我目前使用的Rails 3)使用ActiveRecord :: ConnectionAdapters :: MysqlAdapter是一个贫穷的方式去,仿佛在使用数据库适配器是MySQL的它只是初始化。 即使你已经安装了MySQL的宝石,如果它不是你的连接类型,该呼叫失败的西港岛线:

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财产。



Answer 5:

这可能帮助:

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



文章来源: How do I check the Database type in a Rails Migration?