如何为迁移禁用db:schema:dump

问题描述

|| 我不希望Rails 3在每次迁移时都生成我的架构。如何正确禁用它? 谢谢     

解决方法

        像这样创建一个特定于应用程序的任务(如Alex Kaushovik所建议的)。 创建一个文件“ 0”(实际名称没有关系,您在lib \\ tasks中需要一个.rake文件),其内容如下所示(向Matthew Bass授予ѭ1cr)
Rake::TaskManager.class_eval do
  def remove_task(task_name)
    @tasks.delete(task_name.to_s)
  end
end

Rake.application.remove_task(\'db:schema:dump\')
namespace :db do
  namespace :schema do
    task :dump do
      # Overridden to do nothing
    end
  end
end
    ,        对于仍在寻找在迁移后禁用数据库转储的方法的人,rails 4中现在提供了一个配置,可以将其设置为false,如下所示:
config.active_record.dump_schema_after_migration = false
将阻止它。在此更改中添加了配置-https://github.com/rails/rails/pull/13948     ,        根据David Waller的回答进行的修改,保留了手动运行db:schema:dump的功能。涵盖了自动调用架构转储的所有任务。基于相关任务的Rails 3.2.14版本-更改rails版本时,您将要确保任务定义仍然有效。 认真地,应该有一个配置选项来禁用自动模式转储。
Rake::TaskManager.class_eval do
  def remove_task(task_name)
    @tasks.delete(task_name.to_s)
  end

  Rake.application.remove_task(\"db:migrate\")
  Rake.application.remove_task(\"db:rollback\")
  Rake.application.remove_task(\"db:forward\")
  Rake.application.remove_task(\"db:migrate:up\")
  Rake.application.remove_task(\"db:migrate:down\")

end

namespace :db do

  desc \"Migrate the database (options: VERSION=x,VERBOSE=false).\"
  task :migrate => [:environment,:load_config] do
    ActiveRecord::Migration.verbose = ENV[\"VERBOSE\"] ? ENV[\"VERBOSE\"] == \"true\" : true
    ActiveRecord::Migrator.migrate(ActiveRecord::Migrator.migrations_paths,ENV[\"VERSION\"] ? ENV[\"VERSION\"].to_i : nil) do |migration|
      ENV[\"SCOPE\"].blank? || (ENV[\"SCOPE\"] == migration.scope)
    end
    # db_namespace[\'_dump\'].invoke
  end

  desc \'Rolls the schema back to the previous version (specify steps w/ STEP=n).\'
  task :rollback => [:environment,:load_config] do
    step = ENV[\'STEP\'] ? ENV[\'STEP\'].to_i : 1
    ActiveRecord::Migrator.rollback(ActiveRecord::Migrator.migrations_paths,step)
    # db_namespace[\'_dump\'].invoke
  end

  # desc \'Pushes the schema to the next version (specify steps w/ STEP=n).\'
  task :forward => [:environment,:load_config] do
    step = ENV[\'STEP\'] ? ENV[\'STEP\'].to_i : 1
    ActiveRecord::Migrator.forward(ActiveRecord::Migrator.migrations_paths,step)
    # db_namespace[\'_dump\'].invoke
  end

  namespace :migrate do

    # desc \'Runs the \"up\" for a given migration VERSION.\'
    task :up => [:environment,:load_config] do
      version = ENV[\'VERSION\'] ? ENV[\'VERSION\'].to_i : nil
      raise \'VERSION is required\' unless version
      ActiveRecord::Migrator.run(:up,ActiveRecord::Migrator.migrations_paths,version)
      # db_namespace[\'_dump\'].invoke
    end

    # desc \'Runs the \"down\" for a given migration VERSION.\'
    task :down => [:environment,:load_config] do
      version = ENV[\'VERSION\'] ? ENV[\'VERSION\'].to_i : nil
      raise \'VERSION is required\' unless version
      ActiveRecord::Migrator.run(:down,version)
      # db_namespace[\'_dump\'].invoke
    end

  end

end
    ,        我已经测试了以下内容-它可以正常工作: 您可以在服务器上的Rails gem \ lib / tasks文件夹内修改文件\“ databases.rake \”。用以下代码注释掉行:
Rake::Task[\"db:schema:dump\"].invoke if ActiveRecord::Base.schema_format == :ruby
在Ubuntu(和Ubuntu服务器)上,默认情况下位于以下位置:/var/lib/gems/1.8/gems/rails-x.x.x/lib/tasks/databases.rake。 在Rails 2.3.11上进行了测试,但是我很确定它也可以在Rails 3.x.x中使用。 另一个可能的解决方案(未测试): 您无需修改​​Rails文件,只需修改您的应用程序即可。 可以使用名为\“ override_rake_task \”的Rails插件来覆盖Rake任务\“ db:schema:dump \”,该任务在Rails gem中定义。 显然,如果您不使用此插件,并且在Rails应用程序中使用相同的名称定义任务,则rake会执行这两个任务:默认任务和您的任务。     ,        Active Record的默认行为是转储架构,但是只有在架构转储格式设置为ruby(默认值)时,它才会这样做。 通过将模式格式设置为sql,可以在迁移后禁用模式转储。迁移完成后,您可以安全地将其反转为红宝石,而不会产生任何后果。 您可以通过以下方式进行操作: 1)如果您有这样的一行,则将模式显式设置为ruby:
config.active_record.schema_format = :ruby
(它可能位于config / application.rb中,位于config /环境中或在运行迁移的特定环境中)。 然后将其注释掉:
#config.active_record.schema_format = :ruby
2)然后在您正在使用的环境中或在config / application.rb中添加一行以将架构格式设置为SQL,如下所示:
config.active_record.schema_format = :sql
    ,        建议您创建一个单独的任务,而不是覆盖db:migrate行为(这在开发中构建迁移时显然是必需的,而在部署时则是不必要的)。
# http://stackoverflow.com/questions/13646840/how-to-make-rake-dbmigrate-generate-schema-rb-when-using-sql-schema-format
namespace :db do
  desc \"Migrate the database,without dumping the schema.rb\"
  task :deploy => :environment do
    ActiveRecord::Migration.verbose = ENV[\"VERBOSE\"] ? ENV[\"VERBOSE\"] == \"true\" : true
    ActiveRecord::Migrator.migrate(\"db/migrate/\",nil)
  end
end
然后,在部署过程中,您只需
rake db:deploy
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...