如何在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.rb
和environment.rb
build立的数据库连接的所有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";'