从 Rails 控制台运行迁移

有没有一种方法可以在控制台上运行 db: shift 和 db: rollback 的 rake 命令?

It sucks to wait for the rails environment to load!

35637 次浏览

铁路 < = 4

这将允许您在不重新加载整个 Rails 环境的情况下进行迁移:

ActiveRecord::Migrator.migrate "db/migrate"

回滚:

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

Rails > = 5(感谢@gssbzn,他的回答如下)

迁移:

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

回滚:

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

You can use the %x[command]

%x[rake db:migrate]

我在. irbrc 文件中创建了一个方法,它运行迁移,然后重新加载控制台:

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

在这里查看整个文件: https://gist.github.com/imme5150/6548368

在控制台:

ActiveRecord::Migration.remove_column :table_name, :column_name

要在从控制台运行迁移之后更新 schema.rb文件,必须运行 rails db:migrate

我发现从控制台运行一些迁移命令更简单的另一种方法是:

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

这样做的好处是,块中的内容与从实际迁移文件/schema.rb复制和粘贴随机内容兼容。

我需要假装运行了一次迁移来解除部署的阻塞,这可以通过以下方法完成:

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

对于 Rails5.2,已接受的答案已被删除并替换为

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

请注意,这也可能改变未来版本的轨道,因为他们的工作,以添加多个数据库连接

Rails 5和 Rails 6:

ActiveRecord::Base.connection.migration_context.migrate

For Rails 3 and Rails 4:

ActiveRecord::Migrator.migrate 'db/migrate'

运行单次迁移

ActiveRecord: : Migation.add _ column (: table _ name,: column _ name,: data _ type)

运行所有迁移

ActiveRecord: : 促进迁移

To rollback n migrations

ActiveRecord: : Migator.rollback (‘ db/shift’,n)