Ruby on rails 从rails控制台运行迁移

Ruby on rails 从rails控制台运行迁移,ruby-on-rails,ruby-on-rails-3.1,Ruby On Rails,Ruby On Rails 3.1,有没有办法在控制台上为db:migrate和db:rollback运行rake命令 等待rails环境加载太糟糕了 Rails=5(感谢@gssbzn,他的答案如下) 迁移: ActiveRecord::MigrationContext.new("db/migrate").migrate 和回滚: # 3 is the number of migration to rollback, optional, defaults to 1 ActiveRecord::MigrationContext.

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

等待rails环境加载太糟糕了

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

您可以使用%x[命令]

%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
ActiveRecord::Migration.remove_column :table_name, :column_name
请在此处查看整个文件:

在控制台中:

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
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

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

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

class Mig < ActiveRecord::Base; self.table_name = 'schema_migrations';end
Mig.create! version: '20180611172637'
classmig
对于rails 5.2,接受的答案已被删除并替换为

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

请注意,未来版本的rails在为rails 5和rails 6添加多个数据库连接时,这一点也可能会改变:

ActiveRecord::Base.connection.migration_context.migrate
对于Rails 3和Rails 4:

ActiveRecord::Migrator.migrate 'db/migrate'

这违背了不必等待rails加载的目的。@MVC同意!这就是为什么我认为Benoit的答案更好:)请注意,如果您使用的是Mongoid,它是相同的:
Mongoid::Migrator.migrate“db/migrate”
这非常适合添加到Rails appsReceived error中的test_helper.rb中,bash:ActiveRecord::Migrator.migrate:未找到命令。。。使用Rails 2.3.18、ruby 1.9.3p551,现在在Rails控制台内执行命令后执行。如果出于某些奇怪的原因,您的迁移不在
'db/migrate'
中,请使用
ActiveRecord::Tasks::DatabaseTasks.migrations\u path
代替它,这对于Rails 4是正确的,但不适用于以后versions@WestonGanger怎么说?@nruth不确定韦斯顿在这里是正确的。我发现,每当我运行这些命令时,我都可能不得不执行
重新加载
为了在控制台中获得效果,在完成控制台之后,只要我退出控制台,我就执行rails db:migrate,它会迁移它们,并更新db/schema.rb。查看db/schema.rb非常好。它显示了你所有的桌子
railsdb:migrate
updates
schema.rb
,至少我认为这是我发现的。@WestonGanger想发表评论吗?(因为你的评论有问题)@barlop@nruth。一旦运行此命令并更改数据库,就会发生迁移,但不会更新架构。运行
railsdb:migrate
可以自动更新模式。但是,这是一个额外的步骤,答案中没有。@WestonGanger是的,但是因为您可以执行rails db:migrate,所以这不是手动更新schema.rb文件。这会自动更新它。我发现这对于诊断迁移中某些特定于数据库的问题非常有用。非常感谢。