有没有办法在控制台上运行db:migrate和db:rollback的rake命令?
很难等待rails环境加载!
这将允许您在不重新加载整个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::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
中复制和粘贴随机内容兼容。
对于rails 5.2,已接受的答案已被删除并替换为
ActiveRecord::MigrationContext.new("db/migrate").migrate
请注意,因为它们可以更改未来版本的rails,因为它们可以添加多个数据库连接
我需要假装运行迁移以取消阻止部署,这可以通过以下方式完成:
class Mig < ActiveRecord::Base; self.table_name = 'schema_migrations';end
Mig.create! version: '20180611172637'
您可以使用%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
在这里查看整个文件:https://gist.github.com/imme5150/6548368