我有一个充满数据的Ruby on Rails开发数据库。我想删除所有东西,重建数据库。我正在考虑使用类似的东西:
rake db:recreate
这可能吗?
我有一个充满数据的Ruby on Rails开发数据库。我想删除所有东西,重建数据库。我正在考虑使用类似的东西:
rake db:recreate
这可能吗?
当前回答
只需发布以下步骤:删除数据库,然后重新创建它,迁移数据,如果有种子,则播种数据库:
rake db:drop db:create db:migrate db:seed
由于rake的默认环境是开发环境,如果您在spec测试中看到异常,您应该为测试环境重新创建db,如下所示:
RAILS_ENV=test rake db:drop db:create db:migrate
在大多数情况下,测试数据库在测试过程中被播种,因此db:seed任务操作不需要通过。否则,你必须准备数据库:
rake db:test:prepare
or
RAILS_ENV=test rake db:seed
此外,要使用重建任务,您可以添加到Rakefile以下代码:
namespace :db do
task :recreate => [ :drop, :create, :migrate ] do
if ENV[ 'RAILS_ENV' ] !~ /test|cucumber/
Rake::Task[ 'db:seed' ].invoke
end
end
end
然后问题:
rake db:recreate
其他回答
要删除一个特定的数据库,你可以在rails控制台中这样做:
$rails console
Loading development environment
1.9.3 > ActiveRecord::Migration.drop_table(:<table_name>)
1.9.3 > exit
然后再次迁移DB
$bundle exec rake db:migrate
我知道两种方法:
这将重置你的数据库并重新加载你当前的模式:
rake db:reset db:migrate
这将破坏你的数据库,然后创建它,然后迁移你当前的模式:
rake db:drop db:create db:migrate
在这两种情况下,所有数据都会丢失。
TL;DR——我在开发过程中使用这个rake脚本删除所有内容,包括模式文件,然后直接从迁移脚本重新构建。它同时重建开发和测试数据库。这是我发现的唯一能保证一切都如我所愿的方法。我用了很多年都没有问题。
# lib/tasks/db_rebuild.rake
require 'fileutils'
namespace :db do
desc "Create DB if it doesn't exist, then migrate and seed"
task :build do
Rake::Task["db:create"].invoke
Rake::Task["db:migrate"].invoke
Rake::Task["db:seed"].invoke
end
desc "Drop database and rebuild directly from migrations (ignores schema.rb)"
task :rebuild do
raise "Task not permitted in production." if ENV["RAILS_ENV"] == "production"
puts "*** Deleting schema.rb"
system "rm -f #{Rails.root.join("db", "schema.rb")}"
puts "*** Deleting seed lock files"
system "rm -f #{Rails.root.join("db", ".loaded*")}"
puts "*** Recreate #{ENV['RAILS_ENV']} database"
begin
Rake::Task['environment'].invoke
ActiveRecord::Base.connection
rescue ActiveRecord::NoDatabaseError
# database doesn't exist yet, just create it.
Rake::Task["db:build"].invoke
rescue Exception => e
raise e
else
Rake::Task["db:environment:set"].invoke
# https://github.com/rails/rails/issues/26319#issuecomment-244015760
# ENV["DISABLE_DATABASE_ENVIRONMENT_CHECK"] = '1'
Rake::Task["db:drop"].invoke
Rake::Task["db:build"].invoke
end
Rake::Task["db:retest"].invoke
end
desc "Recreate the test DB"
task :retest do
system("rake db:drop db:build RAILS_ENV=test")
end
end
基本原理——所有提供的解决方案的问题是Rails提供的本地Rake任务依赖于schema.rb。当我做大量的数据建模时,我直接对迁移文件进行更改;只有在它们被提交到上游之后,我们才将它们视为不可变的。但是如果我对迁移文件做了更改,它们就不会反映在schema.rb中。
另一个问题是开发环境和测试环境之间的区别。Rails db任务独立地处理它们,但根据我的经验,开发和测试数据库应该始终保持对等,这意味着在开发时我必须运行大量重复的数据库清理。
更新:在Rails 5中,这个命令可以通过以下命令访问:
rails db:清除db:创建db:迁移RAILS_ENV=test
在最新的rails 4.2版本中,你现在可以运行:
rake db:purge
来源:提交
# desc "Empty the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:drop:all to drop all databases in the config). Without RAILS_ENV it defaults to purging the development and test databases."
task :purge => [:load_config] do
ActiveRecord::Tasks::DatabaseTasks.purge_current
end
它可以像上面提到的那样一起使用:
rake db:purge db:create db:migrate RAILS_ENV=test
我使用:
删除数据库。 Rails db:create根据config/database.yml创建数据库
以上命令可能替换为rails db:reset。
不要忘记运行rails db:migrate来运行迁移。