【发布时间】:2010-12-10 08:38:29
【问题描述】:
我有以下迁移,我希望能够检查当前与环境相关的数据库是否为 mysql 数据库。如果是 mysql,那么我想执行特定于数据库的 SQL。
我该怎么做?
类 AddUsersFb【问题讨论】:
标签: ruby-on-rails ruby migration rails-migrations
我有以下迁移,我希望能够检查当前与环境相关的数据库是否为 mysql 数据库。如果是 mysql,那么我想执行特定于数据库的 SQL。
我该怎么做?
类 AddUsersFb【问题讨论】:
标签: ruby-on-rails ruby migration rails-migrations
更短的通话时间
ActiveRecord::Base.connection.adapter_name == 'MySQL'
【讨论】:
ActiveRecord::Base.connection.adapter_name.downcase.starts_with? 'mysql'
ActiveRecord::Base.connection.adapter_name == "Mysql2" 在 Rails 4 中为我工作。
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"
【讨论】:
ActiveRecord::Base.connection.instance_of? ActiveRecord::ConnectionAdapters::MysqlAdapter 应该解决它。
AbstractAdapter 中有一个 adapter_name,自 Rails2 以来就有。
所以像这样在迁移中更容易使用:
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
【讨论】:
when :mysql, :mysql2。
在 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 属性。
【讨论】:
这可能会有所帮助:
execute 'alter table users modify fb_user_id bigint WHERE USER() = "mysqluser";'
【讨论】:
USER()函数的数据库,例如SQLite。