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


582

我有一个充满数据的dev Ruby on Rails数据库。我想删除所有内容并重建数据库。我正在考虑使用类似:

rake db:recreate

这可能吗?


我建议您浏览最高的答案。我认为这rake db:drop db:create db:schema:load可能比rake db:drop db:create db:migrate(尽管我已经准备好在这方面做错了)更合适。
杰森·斯威特


2
rake db:drop db:create db:migrate
威廉·汉普郡

db:drop + db:create + db:migrate == db:migrate:resetdb:schema:load当迁移中断时,我通常会诉诸。我很少需要重新创建数据库,因此速度并不重要。此外,如果您有未迁移,db:schema:loaddb:reset不会应用它们。不知道这是否是一个很大的争论。
x-yuri

Answers:


1074

我知道两种方法可以做到这一点:

这将重置您的数据库并重新加载当前架构:

rake db:reset db:migrate

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

rake db:drop db:create db:migrate

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


36
它似乎rake db:reset还运行所有迁移(至少在Rails 3上),因此应该只需要所有的内容,对吗?
plindberg 2011年

1
或者,相反,它使架构与运行所有迁移所具有的架构相同。但是迁移本身并不是运行的(因此,如果您进行的迁移是插入数据,则不会发生;为此,您实际上应该使用db / seeds.rb文件)。
plindberg 2011年

1
我知道对于Tracks GTD应用程序db:migrate无效。从Sqlite3迁移到Postgres时,我必须执行db:reset。
迷宫2012年

11
您还需要运行rake db:test:prepare以进行测试,否则会收到类似以下的错误:Could not find table 'things' (ActiveRecord::StatementInvalid)
s2t2 2013年

31
有人应该明确这一点,rake db:reset然后rake db:drop db:create db:migrate 做两件事。后者会清除整个应用程序数据库,然后重新创建它,然后进行每次迁移以更新架构(db/schema.rbdb/structure.sql),但不会用种子数据填充它。相反,第一个是的别名rake db:drop db:schema:load db:seed,因此它会擦除整个应用程序数据库,但不会更新架构,然后填充种子数据。因此,如果您在迁移中没有进行任何更改,则前者会更快,后者会更安全。
Claudio Floreani 2015年

157

在Rails 4上,所有需要的是

$ rake db:schema:load

这将删除数据库上的全部内容,并从schema.rb文件中重新创建模式,而不必一一应用所有迁移。


6
也适用于rails 3。当您刚刚弄乱测试数据库并将其重置为与您的开发数据库匹配的工作版本时非常有用
bigpotato 2014年

谢谢你 我没有意识到这一点,db:drop并且db:create是多余的。
Grant Birchmeier 2014年

3
这不会更新架构,如果您重构迁移,则不是安全的方法。
Claudio Floreani

这是对我最好的答案。
roxdurazo '16

2
@ClaudioFloreani重构迁移带来麻烦。一旦运行,就应该将它们永久地单独放置。
nrowegt '16

45

我在终端中使用以下一种衬板。

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

我将其作为外壳别名并命名为 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+

12
这将一个接一个地运行所有迁移,这是不可扩展的并且容易出错。另外,我非常确定db:migrate会更新您的schema.rb,因此您的schema:dump不会做任何有用的事情。
coreyward

那么如何清空数据库呢?开发中...全部清除。
AnApprentice,2010年

3
@AnApprentice您可以运行db:reset,而只需一个Google(或查看Guides)。我的评论并不是建议您不要使用它,而是要避免db:migrate在您真正想要的是时使用db:schema:load
coreyward 2012年

7
顺便说一句,@ TK,您实际上不需要根据最后一个出口的状态将所有这些作为单独的进程运行。相反,只需将所有所需任务传递给rake,如下所示:rake db:drop db:create db:schema:load
coreyward 2012年

1
这是轶事,但我从来没有遇到过运行问题的情况db:migrate…… 但是db:schema:load对于忘记将schema.rb连同新迁移一起签入版本控制的人很敏感。
johncip '16

37

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

rails db:purge db:create db:migrate 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

正如@bekicot用普通的英语说的db:purge“删除所有数据,但保留所有表和列”
MCB

@MCB我错了,对此感到抱歉,db:purge 没有保留表。
Yana Agun Siswanto

29

根据您的需求,可以使用…

rake db:create

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

rake db:schema:load

…从schema.rb文件的头开始构建数据库。


1
您必须首先删除数据库…或者您可以根据需要删除表。
coreyward

5
+1用于架构加载。有时迁移会搞砸,但是架构应该保持不变。
丹尼(Danny)

我在The Rails 3 Way中读到,加载架构是必须的,而不是运行所有迁移。我不记得他们的推理到底是什么,但这似乎是有道理的。如果两种方法的最终结果相同,那么从模式中加载数据库比运行一堆迁移看起来更简单,更不容易出错。
杰森·斯威特

3
原因是迁移是为了迁移数据,并且随着模型的更改而变得越来越脆弱。您可以(并且应该)在可行的情况下将最小范围的模型烘烤到您的迁移中,以确保它们能够运行,但这并不能很好地扩展,并且效率远远低于仅从应用程序知道的最终目的来构建数据库。当您仅可以从蓝图本身进行构建时,为什么要依靠迁移来创建一个类似于您的架构的数据库?
coreyward 2012年

13

从命令行运行

rake db:migrate:reset

这是使应用再次运行所有迁移的唯一方法。由于每个迁移进行了更改schema.rb,如果你只dropcreatemigrate不会做任何事情(6在轨道上测试)
洗发水

12

使用方式

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

合而为一。由于环境不会一次又一次地重新加载,因此速度更快。

db:drop-将删除数据库。

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

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

db:seed-将运行可能来自目录(db / migration / seed.rb)的种子数据。

我通常更喜欢:

rake db:reset

一次完成所有操作。

干杯!


1
我想为此添加db:test:prepare。当然,这取决于您是否要测试。
ctc 2015年

db:reset == db:drop + db:schema:load + db:seeddb:migrate:reset == db:drop + db:create + db:migrate
x-yuri

11

只需执行以下步骤顺序:删除数据库,然后再次重新创建它,迁移数据,如果有种子,则播种数据库:

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

由于默认的环境rakedevelopment,因此如果您在规格测试中看到异常,则应为测试环境重新创建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

8

您可以手动执行以下操作:

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

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

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

您的数据在所有情况下都会被吹走。


6

您可以使用以下命令行:

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

4

要删除特定的数据库,可以在rails控制台上执行以下操作:

$rails console
Loading development environment
1.9.3 > ActiveRecord::Migration.drop_table(:<table_name>)
1.9.3 > exit

然后再次迁移数据库

$bundle exec rake db:migrate 

4

在rails 4.2上,删除所有数据但保留数据库

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

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


好吧...只是尝试过,但是它不保留表和列。在运行db:purge之后,必须运行db:migrate。因此,这不会保留表和列。但是,它确实保留了数据库本身,因此您不必db:create
Freddo,2016年

1
@Cedric您是对的,db:purge不会保留该表。我更新了代码。
Yana Agun Siswanto '16


2

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

rake db:reset

1

因为在开发中,您将一直想重新创建数据库,所以您可以在lib / tasks文件夹中定义一个rake任务。

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

在终端中,您将运行

rake db:all

它将重建您的数据库


1

我认为运行此命令的最佳方法是:

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


1

3个选项,相同的结果:

1.所有步骤:

  $ 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

2.重置:

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

3.迁移:重置:

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

笔记:

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

0

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

我使用以下方法添加了两个新模型并创建了它们:

rake db:migrate

然后,我编辑了schema.rb文件。我手动删除了不再需要的旧模型,根据需要更改了外键字段,并对其进行了重新排序以使其更清楚。我删除了所有迁移,然后通过以下方式重新运行构建:

rake db:reset

效果很好。当然,所有数据都必须重新加载。Rails意识到迁移已被删除并重置了高水位标记:

-- assume_migrated_upto_version(20121026094813, ["/Users/sean/rails/f4/db/migrate"])
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.