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

AnA*_*ice 571 rake ruby-on-rails ruby-on-rails-3

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

rake db:recreate
Run Code Online (Sandbox Code Playgroud)

这可能吗?

the*_*gah 1050

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

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

rake db:reset db:migrate
Run Code Online (Sandbox Code Playgroud)

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

rake db:drop db:create db:migrate
Run Code Online (Sandbox Code Playgroud)

两种情况下都会丢失所有数据.

  • 似乎`rake db:reset`也运行所有迁移(至少在Rails 3上),所以这应该是所有需要的,对吧? (34认同)
  • 有人应该说明`rake db:reset`和`rake db:drop db:create db:migrate`**做两件完全不同的事情**.后者清除整个应用程序数据库,重新创建它,然后通过每次迁移来更新模式(`db/schema.rb`或`db/structure.sql`),但不填充种子数据.第一个是"rake db:drop db:schema:load db:seed"的别名,因此它会清除整个应用程序数据库,但它不会更新架构**,然后填充种子数据.因此,如果您没有更改迁移中的任何内容,则第一个更快,后者更安​​全. (27认同)
  • 您还需要运行`rake db:test:prepare`进行测试,否则您将收到如下错误:`找不到表''的东西'(ActiveRecord :: StatementInvalid)` (11认同)
  • 或者更确切地说,它使模式与运行所有迁移所具有的模式相同。但迁移本身并不运行(因此,如果您有插入数据的迁移,则不会发生这种情况;为此,您应该真正使用 db/seeds.rb 文件)。 (2认同)

Ene*_*nso 156

在Rails 4上,所有需要的都是

$ rake db:schema:load
Run Code Online (Sandbox Code Playgroud)

这将删除数据库上的全部内容,并从schema.rb文件重新创建模式,而无需逐个应用所有迁移.

  • 适用于轨道3.当您刚刚搞砸了测试数据库并希望将其重置为与您的dev db匹配的工作版本时非常有用 (6认同)
  • 这不会更新架构,如果您重构迁移,则不是一种安全的方法. (3认同)
  • @ClaudioFloreani重构迁移正在寻找麻烦.一旦他们跑了,他们应该永久地独处. (2认同)

TK.*_*TK. 44

我在终端使用以下一个班轮.

$ rake db:drop && rake db:create && rake db:migrate && rake db:schema:dump && rake db:test:prepare
Run Code Online (Sandbox Code Playgroud)

我把它作为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+
Run Code Online (Sandbox Code Playgroud)

  • 这将一个接一个地运行所有迁移,这不可扩展且容易出错.另外,我非常确定db:migrate会更新schema.rb,因此你的schema:dump没有做任何有用的事情. (12认同)
  • 顺便说一句,@ TK,你真的不需要根据最后一个的退出状态将所有这些作为单独的进程运行.相反,只需将所有需要的任务传递给`rake`,就像这样:`rake db:drop db:create db:schema:load`. (7认同)
  • @AnApprentice你可以运行`db:reset`,这只是一个谷歌(或检查[指南](http://guides.rubyonrails.org)).我的评论不是建议不要使用它,而是要避免使用`db:migrate`,而你真正想要的是`db:schema:load`. (3认同)

Rob*_*yle 37

更新:随着Rails 5的出现,可以通过以下命令访问此命令:

rails db:purge db:create db:migrate RAILS_ENV = test


从最新的rails 4.2版本开始,您现在可以运行:

rake db:purge 
Run Code Online (Sandbox Code Playgroud)

来源:提交

# 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
Run Code Online (Sandbox Code Playgroud)

它可以像上面提到的一起使用:

rake db:purge db:create db:migrate RAILS_ENV=test
Run Code Online (Sandbox Code Playgroud)


cor*_*ard 29

根据您的需要,您可以使用......

rake db:create

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

rake db:schema:load

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

  • 架构加载+1.有时迁移会搞砸,但架构应该保持原样. (5认同)
  • 原因是迁移意味着*迁移*数据,并随着模型的变化而变得越来越脆弱.您可以(并且应该)在可行的情况下将最小范围的模型烘焙到您的迁移中以确保它们运行,但这只是不能很好地扩展,并且比从应用程序知道的最终点构建数据库效率低得多.当您可以从蓝图本身构建时,为什么要依赖迁移来创建看起来像您的模式的数据库? (3认同)

小智 11

从命令行运行

rake db:migrate:reset
Run Code Online (Sandbox Code Playgroud)

  • 这是使应用程序再次运行所有迁移的唯一方法。因为每次迁移都会更改“schema.rb”,如果您只使用“drop”和“create”,“migrate”将不会执行任何操作(在 Rails 6 上测试) (2认同)

Мал*_*евъ 11

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

rake db:drop db:create db:migrate db:seed
Run Code Online (Sandbox Code Playgroud)

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

RAILS_ENV=test rake db:drop db:create db:migrate
Run Code Online (Sandbox Code Playgroud)

在大多数情况下,测试数据库在测试过程中被播种,因此db:seed不需要传递任务操作.否则,您应该准备数据库:

rake db:test:prepare
Run Code Online (Sandbox Code Playgroud)

要么

RAILS_ENV=test rake db:seed
Run Code Online (Sandbox Code Playgroud)

此外,要使用重新创建任务,您可以将以下代码添加到Rakefile中:

namespace :db do
   task :recreate => [ :drop, :create, :migrate ] do
      if ENV[ 'RAILS_ENV' ] !~ /test|cucumber/
         Rake::Task[ 'db:seed' ].invoke
      end
   end
end
Run Code Online (Sandbox Code Playgroud)

然后发出:

rake db:recreate
Run Code Online (Sandbox Code Playgroud)


Man*_*ava 11

用得像

rake db:drop db:create db:migrate db:seed
Run Code Online (Sandbox Code Playgroud)

全部在一条线上.这更快,因为环境不会一次又一次地重新加载.

db:drop - 将丢弃数据库.

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

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

db:seed - 将从目录(db/migration/seed.rb)运行种子数据.

我通常喜欢:

rake db:reset
Run Code Online (Sandbox Code Playgroud)

一次做所有.

干杯!


Eri*_*man 8

你可以手动做:

rake db:drop
rake db:create
rake db:migrate
Run Code Online (Sandbox Code Playgroud)

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

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

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


小智 6

您可以使用以下命令行:

rake db:drop db:create db:migrate db:seed db:test:clone
Run Code Online (Sandbox Code Playgroud)


Mar*_*rez 6

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

rails db:seed:replant # Truncates tables of each database for current environment and loads the seeds
Run Code Online (Sandbox Code Playgroud)

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