【问题标题】:How do I check the Database type in a Rails Migration?如何在 Rails 迁移中检查数据库类型?
【发布时间】:2010-12-10 08:38:29
【问题描述】:

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

我该怎么做?

类 AddUsersFb

【问题讨论】:

    标签: ruby-on-rails ruby migration rails-migrations


    【解决方案1】:

    更短的通话时间

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

    【讨论】:

    • 我正在使用 mysql2 gem,我怀疑其他人可能在这一点上,所以我使用以下:ActiveRecord::Base.connection.adapter_name.downcase.starts_with? 'mysql'
    • ActiveRecord::Base.connection.adapter_name == "Mysql2" 在 Rails 4 中为我工作。
    【解决方案2】:

    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"
    

    【讨论】:

    • ActiveRecord::Base.connection.instance_of? ActiveRecord::ConnectionAdapters::MysqlAdapter 应该解决它。
    【解决方案3】:

    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
    

    【讨论】:

    • 这不适用于 mysql2 gem - 您可以将行编辑为 when :mysql, :mysql2
    • 您的回答更加完整和干净。谢谢。
    • 对于 postgres:` def is_postgres? name = ActiveRecord::Base.connection.adapter_name.downcase name =~ /postgres/ end `
    【解决方案4】:

    在 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 属性。

    【讨论】:

      【解决方案5】:

      这可能会有所帮助:

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

      【讨论】:

      • 当用户不同时它不会工作,并且不会工作任何没有定义USER()函数的数据库,例如SQLite。
      猜你喜欢
      • 2012-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-01
      • 2012-04-11
      • 1970-01-01
      • 2011-06-07
      相关资源
      最近更新 更多