清除或重新创建Ruby on Rails数据库

我有一个充满数据的Ruby on Rails开发数据库。我想删除所有东西,重建数据库。我正在考虑使用类似的东西:

rake db:recreate

这可能吗?

426189 次浏览

根据你想要的,你可以使用…

# EYZ0

config/database.yml开始构建数据库,或者…

# EYZ0

schema.rb文件开始构建数据库。

我在Terminal中使用了以下一行。

$ rake db:drop && rake db:create && rake db:migrate && rake db:schema:dump && rake db:test:prepare

我将其作为shell别名,并将其命名为remigrate

到现在为止,你可以很容易地“链接”Rails任务:

$ rake db:drop db:create db:migrate db:schema:dump db:test:prepare # db:test:prepare no longer available since Rails 4.1.0.rc1+

我知道两种方法:

这将重置你的数据库并重新加载你当前的模式:

rake db:reset db:migrate

这将破坏你的数据库,然后创建它,然后迁移你当前的模式:

rake db:drop db:create db:migrate

在这两种情况下,所有数据都会丢失。

今天我对rails模式做了一些更改。我意识到我需要在一个层次结构中增加两个模型,并删除其他一些模型。需要对模型和控制器进行许多小的更改。

我添加了两个新模型并创建了它们,使用:

rake db:migrate

然后我编辑模式。rb文件。我手动删除了不再需要的旧模型,根据需要更改外键字段,只是重新排序了一下,让它对我来说更清楚。我< em > < / em >删除所有的迁移,然后重新运行构建通过:

rake db:reset

它工作得很完美。当然,所有的数据都必须重新加载。Rails意识到迁移已经被删除,并重置了高水位标记:

-- assume_migrated_upto_version(20121026094813, ["/Users/sean/rails/f4/db/migrate"])

您可以使用以下命令行:

rake db:drop db:create db:migrate db:seed db:test:clone

根据Rails指南,应该使用这一行,因为它将从schema.rb加载,而不是一个一个地重新加载迁移文件:

rake db:reset

您可以手动执行:

rake db:drop
rake db:create
rake db:migrate

或者只是rake db:reset,它将运行上述步骤,但也将运行您的db/seeds.rb文件。

一个额外的细微差别是,rake db:reset直接从schema.rb文件加载,而不是再次运行所有的迁移文件。

你的数据在任何情况下都会消失。

要删除一个特定的数据库,你可以在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:migrate:reset

在Rails 4中,所需要的是

$ rake db:schema:load

这将删除您的DB上的全部内容,并根据您的模式重新创建模式。Rb文件,而不必逐一应用所有迁移。

只需发布以下步骤:删除数据库,然后重新创建它,迁移数据,如果有种子,则播种数据库:

rake db:drop db:create db:migrate db:seed

由于rake的默认环境是发展,如果你在规范测试中看到异常,你应该为测验环境重新创建db,如下所示:

RAILS_ENV=test rake db:drop db:create db:migrate

在大多数情况下,测试数据库是在测试过程中播种的,因此不需要通过db:seed任务操作。否则,你必须准备数据库:

rake db:test:prepare

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

使用像

rake db:drop db:create db:migrate db:seed

都在一行里。这更快,因为环境不会一次又一次地重新加载。

db:下降 -删除数据库。

db:创建 -将创建数据库(host/db/password将取自config/database.yml)

db: migrate -将从目录(db /迁移/.rb运行现有的迁移)*。

db:种子 -将运行种子数据可能从目录(db /迁移/ seed.rb)..

我通常喜欢:

rake db:reset

一下子做所有的事。

干杯!

更新:在Rails 5中,这个命令可以通过以下命令访问:

# EYZ0


在最新的rails 4.2版本中,你现在可以运行:

rake db:purge

来源:# EYZ0

# 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 4.2上,删除所有数据,但保留数据库

$ bin/rake db:purge && bin/rake db:schema:load

https://github.com/rails/rails/blob/4-2-stable/activerecord/CHANGELOG.md

因为在开发过程中,您总是希望重新创建数据库,所以可以在lib/tasks文件夹中定义一个rake任务。

  namespace :db do
task :all => [:environment, :drop, :create, :migrate] do
end
end

在终端中运行

rake db:all

它将重新构建数据库

我认为运行这个命令的最好方法是:

**rake db:reset** it does db:drop, db:setup
rake db:setup does db:create, db:schema:load, db:seed

可以使用 db:reset -用于运行db:drop和db:setup或 db:migrate:reset -运行db:drop, db:create和db:migrate.

. db:migrate:reset

依赖于你想要使用现有的模式

你可以简单地跑

# EYZ0

如果你用一些数据创建了种子文件,它会删除数据库,创建新的数据库并从种子中填充db。

3个选项,结果相同:

所有步骤:

  $ rake db:drop           # deletes the database for the current env
$ rake db:create         # creates the database for the current env
$ rake db:schema:load    # loads the schema already generated from schema.rb / erases data
$ rake db:seed           # seed with initial data

# EYZ0重置:

  $ rake db:reset          # drop / schema:load / seed

# EYZ0迁移:重置:

  $ rake db:migrate:reset  # drop / create / migrate
$ rake db:seed

注:

  • 如果使用schema:load比执行所有迁移都快,但结果相同。
  • 所有数据都将丢失。
  • 您可以在一行中运行多个耙。
  • 使用rails 3。

在Rails 6中,有一种方便的方法来重置DB并再次播种:

rails db:seed:replant # Truncates tables of each database for current environment and loads the seeds

https://weblog.rubyonrails.org/2019/3/15/this-week-in-rails-security-fixes-bulk-insert-and-upsert-seeds-replanting/

我使用:

  • rails db:drop删除数据库。
  • config/database.yml的基础上创建数据库

上面的命令可以用rails db:reset代替。

不要忘记运行rails db:migrate来运行迁移。

博士TL;——在开发过程中,我使用这个rake脚本删除所有内容,包括模式文件,然后直接从迁移脚本重新构建。它同时重建devtest数据库。这是我发现的唯一能保证一切都如我所愿的方法。我用了很多年都没有问题。

# 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中。

另一个问题是devtest环境之间的区别。Rails db任务独立地处理它们,但是根据我的经验,devtest数据库应该始终保持对等,这意味着我在开发时必须运行大量重复的数据库清理。