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

rake db:recreate

这可能吗?


当前回答

使用像

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

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

drop -删除数据库。

数据库:create -将创建数据库(主机/ Db /密码将从config/database.yml中获取)

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

Db:seed -将在目录(Db /migration/seed.rb)中运行种子数据。

我通常喜欢:

rake db:reset

一下子做所有的事。

干杯!

其他回答

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

rake db:创建

从config/database中从头构建数据库。yml,还是……

rake db:模式:负载

根据您的模式从头构建数据库。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 

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指南,应该使用这一行,因为它将从模式加载。Rb,而不是一个一个地重新加载迁移文件:

rake db:reset

使用像

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

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

drop -删除数据库。

数据库:create -将创建数据库(主机/ Db /密码将从config/database.yml中获取)

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

Db:seed -将在目录(Db /migration/seed.rb)中运行种子数据。

我通常喜欢:

rake db:reset

一下子做所有的事。

干杯!