【发布时间】:2011-09-02 17:39:59
【问题描述】:
有没有办法在控制台上为 db:migrate 和 db:rollback 运行 rake 命令?
等待 rails 环境加载很糟糕!
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3.1
有没有办法在控制台上为 db:migrate 和 db:rollback 运行 rake 命令?
等待 rails 环境加载很糟糕!
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3.1
在控制台中:
ActiveRecord::Migration.remove_column :table_name, :column_name
要在从控制台运行迁移后更新您的 schema.rb 文件,您必须运行 rails db:migrate
【讨论】:
reload! 才能在控制台中获得效果,并且在完成控制台后,只要我退出控制台,我就会执行 rails db:migrate 和它迁移它们,并更新 db/schema.rb 。真的很好看 db/schema.rb 。它显示了您所有的表格。 rails db:migrate 为你更新 schema.rb,至少我认为这是我发现的。
rails db:migrate 可以自动更新架构。但是,这是答案中没有的额外步骤。
这将允许您在不重新加载整个 rails 环境的情况下进行迁移:
ActiveRecord::Migrator.migrate "db/migrate"
和回滚:
# 3 is the number of migration to rollback, optional, defaults to 1
ActiveRecord::Migrator.rollback "db/migrate", 3
迁移:
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
【讨论】:
Mongoid::Migrator.migrate "db/migrate"
schema_migration:ActiveRecord::MigrationContext.new(ActiveRecord::Migrator.migrations_paths, ActiveRecord::Base.connection.schema_migration)
我发现从控制台运行一些迁移命令更简洁的另一种方法是:
ActiveRecord::Schema.define do
create_table :foo do |t|
t.string :bar
t.timestamps
end
end
这样做的好处是块内的内容与从真实迁移文件/schema.rb中复制和粘贴随机内容兼容。
【讨论】:
对于 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'
【讨论】:
我需要假装已运行迁移以取消阻止部署,这可以通过以下方式完成:
class Mig < ActiveRecord::Base; self.table_name = 'schema_migrations';end
Mig.create! version: '20180611172637'
【讨论】:
你可以使用 %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.add_column(:table_name, :column_name, :data_type)
ActiveRecord::Migrator.migrate('db/migrate')
ActiveRecord::Migrator.rollback('db/migrate', n)
【讨论】: