如何从Rails中的所有表中删除所有数据?

我可以做Post.delete_all来删除我的所有post,但是如果我想删除所有post,评论,博客等呢?

如何迭代所有模型并运行delete_all方法?

 rake db:reset 

它从迁移中重新创build你的表格。

正如在评论中所build议的那样,更快的方法来做到这一点(但你必须添加一个新的rake任务)是:

 namespace :db do desc "Truncate all tables" task :truncate => :environment do conn = ActiveRecord::Base.connection tables = conn.execute("show tables").map { |r| r[0] } tables.delete "schema_migrations" tables.each { |t| conn.execute("TRUNCATE #{t}") } end end 

从SO复制的答复 。

你可以更好地控制:

 rake db:drop:all 

然后创build数据库而不运行迁移,

 rake db:create:all 

然后运行所有的迁移,

 rake db:migrate 

你也可以这样做:

 mysqladmin drop databasename 

如果你正在尝试从代码而不是命令行执行此操作,那么从Test::Unit::TestCase#teardown方法说,你可以

 class MyTest < Test::Unit::TestCase def teardown ActiveRecord::Base.subclasses.each(&:delete_all) end end 

要么

 class MyTest < Test::Unit::TestCase def teardown Rake::Task['db:reset'].invoke end end 

不过,我警告过你,两者都不是特别快。 如果可以的话,交易testing肯定会更好。

如果你只是想用新的空表开始,你可以首先确保在db / schema.rb中有一个最新的模式定义:

 rake db:schema:dump 

接着:

 rake db:schema:load 

这会影响表格的删除,然后重新创build它们,而不会通过整个迁移过程。

删除表格行的更快捷的方法是使用TRUNCATE命令。

许多其他答案似乎忽略了删除行和删除表之间的区别。 删除表将销毁表数据和模式; 这意味着您需要额外的步骤来重新创build表格。 肖恩·麦克利里的答案是我看到的最好的,所以我以此为出发点。 不过,我认为最好是利用TRUNCATE命令,因为它应该更快,并且还会重置自动递增键。 此外,使用map而不是each缩短代码一点。

 namespace :db do desc "Truncate all tables" task :truncate => :environment do conn = ActiveRecord::Base.connection tables = conn.execute("show tables").map { |r| r[0] } tables.delete "schema_migrations" tables.each { |t| conn.execute("TRUNCATE #{t}") } end end 

rake db:purge

最近被添加到轨道4.2.0.alpha主分支的ActiveRecord

https://github.com/rails/rails/commit/e2f232aba15937a4b9d14bd91e0392c6d55be58d

你可以列出种子文件(seeds.rb)中的所有模型,并简单地运行

 rake db:seed 

种子文件会看起来像这样:

 Model1.delete_all Model2.delete_all Model3.delete_all Model4.delete_all Model5.delete_all Model6.delete_all Model7.delete_all 

rake db:reset是太多的工作在这里。 这将完全杀死你的数据库,并重新从头开始,运行所有的迁移等。运行种子命令更快。

这也适用于Rails 4

 (ActiveRecord::Base.connection.tables - ['schema_migrations']).each do |table| table.classify.constantize.destroy_all end 

在Stack Overflow中,我们一直忽略了这个数据库 ,并没有提到database_cleaner gem :

数据库清理器是一套在Ruby中清理数据库的策略。 最初的用例是在testing过程中确保一个干净的状态。 每个策略都是less量代码,但是在任何使用数据库进行testing的Ruby应用程序中通常都需要使用代码。

Mabey先生的“策略”是指:截断,交易和删除。

支持ActiveRecord,DataMapper,Sequel,MongoMapper,Mongoid和CouchPotato。

这是一个来自数据库清洁器自述文件的快速代码片段:

 require 'database_cleaner' DatabaseCleaner.strategy = :truncation # then, whenever you need to clean the DB DatabaseCleaner.clean 

Postgres db接受的答案:

 namespace :db do desc "Truncate all tables" task :truncate => :environment do conn = ActiveRecord::Base.connection postgres = "SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname='public'" tables = conn.execute(postgres).map { |r| r['tablename'] } tables.delete "schema_migrations" tables.each { |t| conn.execute("TRUNCATE \"#{t}\"") } end end 

我知道这是一个古老的问题,但我认为这可能对某人有帮助。 这是清除数据库中所有数据的非常快速的方法。

 tables = [] ActiveRecord::Base.connection.execute("show tables").each { |r| tables << r[0] } tables = tables - ["schema_migrations"] tables.each do |table| ActiveRecord::Base.connection.execute("DELETE FROM #{table} WHERE 1 = 1") end 

我在after(:all)块的某些规格中使用这种技术。 这比任何用于清除,迁移,重置数据库的Rails rake任务快得多,效率也更高。

顺便说一句:我敢肯定这可能会失败,如果你在数据库端强制外键约束。

 # fast truncation of all tables that need truncations (select is 10x faster then truncate) # http://grosser.it/2012/07/03/rubyactiverecord-fastest-way-to-truncate-test-database/ def truncate_all_tables connection = ActiveRecord::Base.connection connection.disable_referential_integrity do connection.tables.each do |table_name| next if connection.select_value("SELECT count(*) FROM #{table_name}") == 0 connection.execute("TRUNCATE TABLE #{table_name}") end end end 

如果您只想在应用程序或导航控制台中使用数据而不触摸表格,则只删除数据:

 Rails.application.eager_load! ActiveRecord::Base.connection.disable_referential_integrity do ApplicationRecord.descendants.each do |model| model.delete_all end end 

有了这个代码,你不必费心手动引用你的模型和/或外键约束(感谢disable_referential_integrity)。
ApplicationRecord.descendants只返回真正的应用程序模型,不像ActiveRecord :: Base.descendants(没有更多的ApplicationRecord,schema_migrations和ar_internal_metadata)。

我的50美分,用于清理数据库,并能够再次运行迁移(在无法删除数据库的情况下,例如AWS RDS):

 # get connection conn = ActiveRecord::Base.connection # find all tables needed to be removed tables = conn.execute("SELECT * FROM pg_catalog.pg_tables WHERE schemaname='public' AND tablename<>'schema_migrations'").to_a.map { |r| r['tablename'] } # remove all tables except schema_migrations tables.each { |t| conn.execute("DROP TABLE #{t}") } # clean migrations table conn.execute("TRUNCATE TABLE schema_migrations") 

现在你可以运行rake db:migrate来让你的db进入一个干净的状态。