从rails控制台运行迁移

时间:2011-09-02 17:40:00

标签: ruby-on-rails ruby-on-rails-3.1

有没有办法在控制台上运行db:migrate和db:rollback的rake命令?

等待rails环境加载很糟糕!

8 个答案:

答案 0 :(得分:73)

在控制台中:

ActiveRecord::Migration.remove_column :table_name, :column_name

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

答案 1 :(得分:67)

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

ActiveRecord::Migrator.migrate "db/migrate"

和回滚:

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

答案 2 :(得分:20)

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

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

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

答案 3 :(得分:5)

对于Rails 5和Rails 6:

ActiveRecord::Base.connection.migration_context.migrate

对于Rails 3和Rails 4:

ActiveRecord::Migrator.migrate 'db/migrate'

答案 4 :(得分:4)

对于Rails 5.2,可接受的答案已被删除并替换为

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

请注意,因为将来的rails版本会添加多个数据库连接,所以这可能也会改变

答案 5 :(得分:2)

我需要假装运行迁移以取消阻止部署,这可以通过以下方式完成:

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

答案 6 :(得分:0)

您可以使用%x [命令]

%x[rake db:migrate]

答案 7 :(得分:0)

我在.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