Ruby on rails 从rails控制台运行迁移
有没有办法在控制台上为db:migrate和db:rollback运行rake命令 等待rails环境加载太糟糕了 Rails=5(感谢@gssbzn,他的答案如下) 迁移: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.
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
updatesschema.rb
,至少我认为这是我发现的。@WestonGanger想发表评论吗?(因为你的评论有问题)@barlop@nruth。一旦运行此命令并更改数据库,就会发生迁移,但不会更新架构。运行railsdb:migrate
可以自动更新模式。但是,这是一个额外的步骤,答案中没有。@WestonGanger是的,但是因为您可以执行rails db:migrate,所以这不是手动更新schema.rb文件。这会自动更新它。我发现这对于诊断迁移中某些特定于数据库的问题非常有用。非常感谢。