46

我有以下迁移,我希望能够检查与环境相关的当前数据库是否是 mysql 数据库。如果是 mysql,那么我想执行特定于数据库的 SQL。

我该怎么做?

类 AddUsersFb < ActiveRecord::Migration

  def self.up
    add_column :users, :fb_user_id, :integer
    add_column :users, :email_hash, :string
    #如果是mysql
    #execute("alter table users 修改 fb_user_id bigint")
  结尾

  def self.down
    删除列:用户,:fb_user_id
    删除列:用户,:电子邮件哈希
  结尾

结尾
4

5 回答 5

59

更短的通话

ActiveRecord::Base.connection.adapter_name == 'MySQL'
于 2010-03-29T08:59:59.467 回答
45

ActiveRecord::Base.connection将为您提供您想知道的有关由boot.rb和建立的数据库连接的所有信息environment.rb

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

正如马塞尔指出的:

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

可能是确定您的数据库是否为 MySQL 的最佳方法。

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

ActiveRecord::Base.connection.instance_values["config"][:adapter] == "mysql"
于 2009-10-27T03:38:52.893 回答
28

从 Rails2 开始就有一个adapter_namein和那个。AbstractAdapter

所以像这样在迁移中更容易使用:

adapter_type = connection.adapter_name.downcase.to_sym
case adapter_type
when :mysql, :mysql2
  # do the MySQL part
when :sqlite
  # do the SQLite3 part
when :postgresql
  # etc.
else
  raise NotImplementedError, "Unknown adapter type '#{adapter_type}'"
end
于 2011-04-14T15:51:44.057 回答
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 属性。

于 2011-01-21T19:21:47.667 回答
-4

这可能会有所帮助:

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

于 2009-10-27T03:37:50.710 回答