如何禁用db:schema:dump以进行迁移

我不希望Rails 3在每次迁移时生成我的模式。 如何正确禁用它?

谢谢

创建一个特定于应用程序的任务(如Alex Kaushovik建议的那样)……

创建一个文件lib\tasks\db_schema_override (实际名称无关紧要,你需要一个lib \ tasks中的.rake文件),内容如下( remove_task Matthew Bass for remove_task

 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, ActiveRecord::Migrator.migrations_paths, 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-xxx/lib/tasks/databases.rake。

使用Rails 2.3.11测试,但我很确定它也适用于Rails 3.xx。

另一种可能的解决方案(未测试):

您不必修改Rails文件,只需修改您的应用程序。

名为“override_rake_task”的rails插件可用于覆盖Rake任务“db:schema:dump”,如果Rails为gem,则在内部定义。

显然,如果您没有使用此插件,并且如果您在rails应用程序中使用相同的名称定义任务,则rake将执行两个任务:默认和您的。

Active Record的默认行为是转储架构,但只有在架构转储格式设置为ruby(默认值)时才会执行。

您可以通过将架构格式设置为sql来在迁移后禁用架构转储。 迁移完成后,您可以安全地将其反转为ruby而不会产生任何后果。

你可以这样做:

1)如果您有这样的行,则将架构明确设置为ruby:

 config.active_record.schema_format = :ruby 

(它可能位于config / application.rb中,位于config / environment或正在运行迁移的特定环境中)。

然后评论出来:

 #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