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
精彩评论