代码之家  ›  专栏  ›  技术社区  ›  Shaun Mundi

如何在Rails迁移中检查数据库类型?

  •  48
  • Shaun Mundi  · 技术社区  · 16 年前

    我进行了以下迁移,我希望能够检查与环境相关的当前数据库是否是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
    
    5 回复  |  直到 11 年前
        1
  •  39
  •   Vadim K.    11 年前

    ActiveRecord::Base.connection.adapter_name == 'MySQL'
    
        2
  •  57
  •   stasl    16 年前

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

    返回大量信息。所以你必须确切地知道你在找什么。

    正如Marcel所指出的:

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

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

    ActiveRecord 释放,我更喜欢这样做:

    ActiveRecord::Base.connection.instance_values["config"][:adapter] == "mysql"
    
        3
  •  25
  •   Hauleth    13 年前

    有一个 adapter_name AbstractAdapter 自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
    
        4
  •  8
  •   ctide    15 年前

    在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
    

        5
  •  -4
  •   CodeJoust    16 年前

    这可能会有所帮助:

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