开发者

Run migrations from rails console

Is there a way to run rake commands for db:migrate and db:roll开发者_开发知识库back on the console?

It sucks to wait for the rails environment to load!


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


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 migrations 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 migrations to rollback, optional, defaults to 1
ActiveRecord::MigrationContext.new("db/migrate").rollback 3


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.


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


For Rails 5 and Rails 6:

ActiveRecord::Base.connection.migration_context.migrate

For Rails 3 and Rails 4:

ActiveRecord::Migrator.migrate 'db/migrate'


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'


You can use the %x[command]

%x[rake db:migrate]


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)


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

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜