Run migrations from rails console

Ruby on-RailsRuby on-Rails-3.1

Ruby on-Rails Problem Overview


Is there a way to run rake commands for db:migrate and db:rollback on the console?

It sucks to wait for the rails environment to load!

Ruby on-Rails Solutions


Solution 1 - Ruby on-Rails

In the console:

ActiveRecord::Migration.remove_column :table_name, :column_name

To update your schema.rb file after running migrations from the console, you must run rails db:migrate

Solution 2 - Ruby on-Rails

Rails <= 4

This will allow you to migrate without reloading the whole rails environment:

ActiveRecord::Migrator.migrate "db/migrate"

and rollback:

# 3 is the number of migration to rollback, optional, defaults to 1
ActiveRecord::Migrator.rollback "db/migrate", 3

Rails >= 5 (thanks to @gssbzn, his answer is below)

Migrate :

ActiveRecord::MigrationContext.new("db/migrate").migrate

And rollback :

# 3 is the number of migration to rollback, optional, defaults to 1
ActiveRecord::MigrationContext.new("db/migrate").rollback 3

Solution 3 - Ruby on-Rails

Another way that I find neater to just run some migration command from console is this:

ActiveRecord::Schema.define do
  create_table :foo do |t|
    t.string  :bar
    t.timestamps
  end
end

This has the advantage that the contents inside the block is compatible with just copy and pasting random contents from a real migration file / schema.rb.

Solution 4 - Ruby on-Rails

For rails 5.2 the accepted answer has been removed and replaced with

ActiveRecord::MigrationContext.new("db/migrate").migrate

Please be aware as this may also change for future versions of rails as they work to add multiple database connections

Solution 5 - Ruby on-Rails

For Rails 5 and Rails 6:

ActiveRecord::Base.connection.migration_context.migrate

For Rails 3 and Rails 4:

ActiveRecord::Migrator.migrate 'db/migrate'

Solution 6 - Ruby on-Rails

I needed to pretend a migration was run to unblock a deploy, this can be done with:

class Mig < ActiveRecord::Base; self.table_name = 'schema_migrations';end
Mig.create! version: '20180611172637'

Solution 7 - Ruby on-Rails

You can use the %x[command]

%x[rake db:migrate]

Solution 8 - Ruby on-Rails

I created a method in my .irbrc file that runs migrations then reloads the console:

def migrate
  if defined? Rails::Console # turn off info logging for Rails 3
    old_log_level = ActiveRecord::Base.logger.try(:sev_threshold)
    ActiveRecord::Base.logger.sev_threshold = Logger::WARN
  end
  reload! && migations_ran = true if ActiveRecord::Migrator.migrate(Rails.root.join("db/migrate")).any?
  ActiveRecord::Base.logger.sev_threshold = old_log_level if defined? old_log_level
  migations_ran ||= nil # useful exit status
end

See the entire file here: https://gist.github.com/imme5150/6548368

Solution 9 - Ruby on-Rails

To run single migration

ActiveRecord::Migration.add_column(:table_name, :column_name, :data_type)

To run all migrations

ActiveRecord::Migrator.migrate('db/migrate')

To rollback n migrations

ActiveRecord::Migrator.rollback('db/migrate', n)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionrafamvcView Question on Stackoverflow
Solution 1 - Ruby on-RailsHomanView Answer on Stackoverflow
Solution 2 - Ruby on-RailsBenoit GarretView Answer on Stackoverflow
Solution 3 - Ruby on-Railskizzx2View Answer on Stackoverflow
Solution 4 - Ruby on-RailsGusView Answer on Stackoverflow
Solution 5 - Ruby on-RailsShai ColemanView Answer on Stackoverflow
Solution 6 - Ruby on-RailsgrosserView Answer on Stackoverflow
Solution 7 - Ruby on-RailsdexterView Answer on Stackoverflow
Solution 8 - Ruby on-RailsJoshView Answer on Stackoverflow
Solution 9 - Ruby on-RailsRakeshView Answer on Stackoverflow