module ActiveRecord::Tasks::DatabaseTasks - activerecord-4.2.4 Documentation

# module ActiveRecord::Tasks::DatabaseTasks

`ActiveRecord::Tasks::DatabaseTasks` is a utility class, which encapsulates logic behind common tasks used to manage database and migrations.

The tasks defined here are used with Rake tasks provided by Active Record.

In order to use DatabaseTasks, a few config values need to be set. All the needed config values are set by Rails already, so it's necessary to do it only if you want to change the defaults or when you want to use Active Record outside of Rails (in such case after configuring the database tasks, you can also use the rake tasks defined in Active Record).

The possible config values are:

    * +env+: current environment (like Rails.env).
    * +database_configuration+: configuration of your databases (as in +config/database.yml+).
    * +db_dir+: your +db+ directory.
    * +fixtures_path+: a path to fixtures directory.
    * +migrations_paths+: a list of paths to directories with migrations.
    * +seed_loader+: an object which will load seeds, it needs to respond to the +load_seed+ method.
    * +root+: a path to the root of the application.

Example usage of `DatabaseTasks` outside Rails could look as such:

    include ActiveRecord::Tasks
    DatabaseTasks.database_configuration = YAML.load_file('my_database_config.yml')
    DatabaseTasks.db_dir = 'db'
    # other settings...

    DatabaseTasks.create_current('production')

### Constants

LOCAL_HOSTS

### Attributes

current_config[W]
database_configuration[RW]
db_dir[W]
env[W]
fixtures_path[W]
migrations_paths[W]
root[W]
seed_loader[W]

### Public Instance Methods

charset(*arguments) click to toggle source

    # File lib/active_record/tasks/database_tasks.rb, line 148
    def charset(*arguments)
      configuration = arguments.first
      class_for_adapter(configuration['adapter']).new(*arguments).charset
    end

charset_current(environment = env) click to toggle source

    # File lib/active_record/tasks/database_tasks.rb, line 144
    def charset_current(environment = env)
      charset ActiveRecord::Base.configurations[environment]
    end

check_schema_file(filename) click to toggle source

    # File lib/active_record/tasks/database_tasks.rb, line 240
    def check_schema_file(filename)
      unless File.exist?(filename)
        message = %Q{#{filename} doesn't exist yet. Run `rake db:migrate` to create it, then try again.}
        message << %Q{ If you do not intend to use a database, you should instead alter #{Rails.root}/config/application.rb to limit the frameworks that will be loaded.} if defined?(::Rails)
        Kernel.abort message
      end
    end

collation(*arguments) click to toggle source

    # File lib/active_record/tasks/database_tasks.rb, line 157
    def collation(*arguments)
      configuration = arguments.first
      class_for_adapter(configuration['adapter']).new(*arguments).collation
    end

collation_current(environment = env) click to toggle source

    # File lib/active_record/tasks/database_tasks.rb, line 153
    def collation_current(environment = env)
      collation ActiveRecord::Base.configurations[environment]
    end

create(*arguments) click to toggle source

    # File lib/active_record/tasks/database_tasks.rb, line 91
    def create(*arguments)
      configuration = arguments.first
      class_for_adapter(configuration['adapter']).new(*arguments).create
    rescue DatabaseAlreadyExists
      $stderr.puts "#{configuration['database']} already exists"
    rescue Exception => error
      $stderr.puts error, *(error.backtrace)
      $stderr.puts "Couldn't create database for #{configuration.inspect}"
    end

create_all() click to toggle source

    # File lib/active_record/tasks/database_tasks.rb, line 101
    def create_all
      each_local_configuration { |configuration| create configuration }
    end

create_current(environment = env) click to toggle source

    # File lib/active_record/tasks/database_tasks.rb, line 105
    def create_current(environment = env)
      each_current_configuration(environment) { |configuration|
        create configuration
      }
      ActiveRecord::Base.establish_connection(environment.to_sym)
    end

current_config(options = {}) click to toggle source

    # File lib/active_record/tasks/database_tasks.rb, line 82
    def current_config(options = {})
      options.reverse_merge! :env => env
      if options.has_key?(:config)
        @current_config = options[:config]
      else
        @current_config ||= ActiveRecord::Base.configurations[options[:env]]
      end
    end

db_dir() click to toggle source

    # File lib/active_record/tasks/database_tasks.rb, line 54
    def db_dir
      @db_dir ||= Rails.application.config.paths["db"].first
    end

drop(*arguments) click to toggle source

    # File lib/active_record/tasks/database_tasks.rb, line 112
    def drop(*arguments)
      configuration = arguments.first
      class_for_adapter(configuration['adapter']).new(*arguments).drop
    rescue ActiveRecord::NoDatabaseError
      $stderr.puts "Database '#{configuration['database']}' does not exist"
    rescue Exception => error
      $stderr.puts error, *(error.backtrace)
      $stderr.puts "Couldn't drop #{configuration['database']}"
    end

drop_all() click to toggle source

    # File lib/active_record/tasks/database_tasks.rb, line 122
    def drop_all
      each_local_configuration { |configuration| drop configuration }
    end

drop_current(environment = env) click to toggle source

    # File lib/active_record/tasks/database_tasks.rb, line 126
    def drop_current(environment = env)
      each_current_configuration(environment) { |configuration|
        drop configuration
      }
    end

env() click to toggle source

    # File lib/active_record/tasks/database_tasks.rb, line 74
    def env
      @env ||= Rails.env
    end

fixtures_path() click to toggle source

    # File lib/active_record/tasks/database_tasks.rb, line 62
    def fixtures_path
      @fixtures_path ||= if ENV['FIXTURES_PATH']
                           File.join(root, ENV['FIXTURES_PATH'])
                         else
                           File.join(root, 'test', 'fixtures')
                         end
    end

load_schema(format = ActiveRecord::Base.schema_format, file = nil) click to toggle source

    # File lib/active_record/tasks/database_tasks.rb, line 191
          def load_schema(format = ActiveRecord::Base.schema_format, file = nil)
            ActiveSupport::Deprecation.warn("          This method will act on a specific connection in the future.
              To act on the current connection, use `load_schema_current` instead.
    ".squish)

            load_schema_current(format, file)
          end

load_schema_current(format = ActiveRecord::Base.schema_format, file = nil, environment = env) click to toggle source

    # File lib/active_record/tasks/database_tasks.rb, line 233
    def load_schema_current(format = ActiveRecord::Base.schema_format, file = nil, environment = env)
      each_current_configuration(environment) { |configuration|
        load_schema_for configuration, format, file
      }
      ActiveRecord::Base.establish_connection(environment.to_sym)
    end

load_schema_current_if_exists(format = ActiveRecord::Base.schema_format, file = nil, environment = env) click to toggle source

    # File lib/active_record/tasks/database_tasks.rb, line 227
    def load_schema_current_if_exists(format = ActiveRecord::Base.schema_format, file = nil, environment = env)
      if File.exist?(file || schema_file(format))
        load_schema_current(format, file, environment)
      end
    end

load_seed() click to toggle source

    # File lib/active_record/tasks/database_tasks.rb, line 248
    def load_seed
      if seed_loader
        seed_loader.load_seed
      else
        raise "You tried to load seed data, but no seed loader is specified. Please specify seed " +
              "loader with ActiveRecord::Tasks::DatabaseTasks.seed_loader = your_seed_loader\n" +
              "Seed loader should respond to load_seed method"
      end
    end

migrate() click to toggle source

    # File lib/active_record/tasks/database_tasks.rb, line 132
    def migrate
      verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true
      version = ENV["VERSION"] ? ENV["VERSION"].to_i : nil
      scope   = ENV['SCOPE']
      verbose_was, Migration.verbose = Migration.verbose, verbose
      Migrator.migrate(Migrator.migrations_paths, version) do |migration|
        scope.blank? || scope == migration.scope
      end
    ensure
      Migration.verbose = verbose_was
    end

migrations_paths() click to toggle source

    # File lib/active_record/tasks/database_tasks.rb, line 58
    def migrations_paths
      @migrations_paths ||= Rails.application.paths['db/migrate'].to_a
    end

purge(configuration) click to toggle source

    # File lib/active_record/tasks/database_tasks.rb, line 162
    def purge(configuration)
      class_for_adapter(configuration['adapter']).new(configuration).purge
    end

purge_all() click to toggle source

    # File lib/active_record/tasks/database_tasks.rb, line 166
    def purge_all
      each_local_configuration { |configuration|
        purge configuration
      }
    end

purge_current(environment = env) click to toggle source

    # File lib/active_record/tasks/database_tasks.rb, line 172
    def purge_current(environment = env)
      each_current_configuration(environment) { |configuration|
        purge configuration
      }
      ActiveRecord::Base.establish_connection(environment.to_sym)
    end

register_task(pattern, task) click to toggle source

    # File lib/active_record/tasks/database_tasks.rb, line 45
    def register_task(pattern, task)
      @tasks ||= {}
      @tasks[pattern] = task
    end

root() click to toggle source

    # File lib/active_record/tasks/database_tasks.rb, line 70
    def root
      @root ||= Rails.root
    end

schema_file(format = ActiveRecord::Base.schema_format) click to toggle source

    # File lib/active_record/tasks/database_tasks.rb, line 200
    def schema_file(format = ActiveRecord::Base.schema_format)
      case format
      when :ruby
        File.join(db_dir, "schema.rb")
      when :sql
        File.join(db_dir, "structure.sql")
      end
    end

seed_loader() click to toggle source

    # File lib/active_record/tasks/database_tasks.rb, line 78
    def seed_loader
      @seed_loader ||= Rails.application
    end

structure_dump(*arguments) click to toggle source

    # File lib/active_record/tasks/database_tasks.rb, line 179
    def structure_dump(*arguments)
      configuration = arguments.first
      filename = arguments.delete_at 1
      class_for_adapter(configuration['adapter']).new(*arguments).structure_dump(filename)
    end

structure_load(*arguments) click to toggle source

    # File lib/active_record/tasks/database_tasks.rb, line 185
    def structure_load(*arguments)
      configuration = arguments.first
      filename = arguments.delete_at 1
      class_for_adapter(configuration['adapter']).new(*arguments).structure_load(filename)
    end

### Private Instance Methods

class_for_adapter(adapter) click to toggle source

    # File lib/active_record/tasks/database_tasks.rb, line 260
    def class_for_adapter(adapter)
      key = @tasks.keys.detect { |pattern| adapter[pattern] }
      unless key
        raise DatabaseNotSupported, "Rake tasks not supported by '#{adapter}' adapter"
      end
      @tasks[key]
    end

each_current_configuration(environment) { |configuration| ... } click to toggle source

    # File lib/active_record/tasks/database_tasks.rb, line 268
    def each_current_configuration(environment)
      environments = [environment]
      # add test environment only if no RAILS_ENV was specified.
      environments << 'test' if environment == 'development' && ENV['RAILS_ENV'].nil?

      configurations = ActiveRecord::Base.configurations.values_at(*environments)
      configurations.compact.each do |configuration|
        yield configuration unless configuration['database'].blank?
      end
    end

each_local_configuration() { |configuration| ... } click to toggle source

    # File lib/active_record/tasks/database_tasks.rb, line 279
    def each_local_configuration
      ActiveRecord::Base.configurations.each_value do |configuration|
        next unless configuration['database']

        if local_database?(configuration)
          yield configuration
        else
          $stderr.puts "This task only modifies local databases. #{configuration['database']} is on a remote host."
        end
      end
    end

local_database?(configuration) click to toggle source

    # File lib/active_record/tasks/database_tasks.rb, line 291
    def local_database?(configuration)
      configuration['host'].blank? || LOCAL_HOSTS.include?(configuration['host'])
    end