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

Tom*_*man 63 activerecord ruby-on-rails

我可以Post.delete_all删除我的所有帖子,但如果我想删除所有帖子,评论,博客等怎么办?

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

Vla*_*anu 83

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

它从迁移中重新创建表.

正如评论中所建议的那样,更快的方法(但你必须添加一个新的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
Run Code Online (Sandbox Code Playgroud)

回复来自:回答SO.

  • **删除表行的更快,更精确的方法是使用TRUNCATE命令:http://stackoverflow.com/a/6332189/109618 (2认同)

Sam*_*r C 28

您可以通过以下方式进行更好的控制

rake db:drop:all
Run Code Online (Sandbox Code Playgroud)

然后在不运行迁移的情况下创建数据库,

rake db:create:all
Run Code Online (Sandbox Code Playgroud)

然后运行所有迁移,

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

你也可以这样做:

mysqladmin drop databasename
Run Code Online (Sandbox Code Playgroud)

  • `rake db:drop:all`试图为我删除生产数据库. (4认同)
  • __WARNING:__这将删除默认_development_环境中的所有表.使用`RAILS_ENV`环境变量进行更精细的控制 (3认同)

Jam*_*sen 24

如果您尝试从代码而不是命令行执行此操作,例如从Test::Unit::TestCase#teardown方法中执行此操作,则可以执行此操作

class MyTest < Test::Unit::TestCase

  def teardown
    ActiveRecord::Base.subclasses.each(&:delete_all)
  end

end
Run Code Online (Sandbox Code Playgroud)

要么

class MyTest < Test::Unit::TestCase

  def teardown
    Rake::Task['db:reset'].invoke
  end

end
Run Code Online (Sandbox Code Playgroud)

但是我警告你:两者都不是特别快.如果可以的话,你肯定会更好地进行交易测试.


Ken*_*enB 17

如果您只想重新开始使用一组新的空表,则可以首先确保在db/schema.rb中拥有最新的模式定义:

rake db:schema:dump
Run Code Online (Sandbox Code Playgroud)

然后:

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

它具有删除表然后重新创建它们的效果,而无需遍历整个迁移过程.


Kah*_*Tim 12

在 Rails 6 中,您可以rails db:truncate_all删除所有数据而不删除任何表。

如果您想在此之后为您的数据库做种子,您还rails db:seed:replant可以截断所有数据和种子数据库

  • 未来的读者请注意:如果数据库中有其他表,即使它们不是基于与相关 Rails 项目关联的模型,所有这些数据也将被删除。尽管该表未与项目中的任何 Rails 模型关联,但运行 truncate_all 时我还是丢失了 330GB 数据。叹 (3认同)

gef*_*gef 11

rails db:purge

最近已被添加到rails 4.2.0.alpha的主分支中的ActiveRecord

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


Dav*_* J. 10

以一个更快的方法只是删除表行是使用TRUNCATE命令.

许多其他答案似乎忽略了删除行和删除表之间的区别.删除表会破坏表数据和模式; 意味着您需要额外的步骤来重新创建表.Sean McLeary的回答是我所见过的最好的,所以我用它作为起点.但是,我认为最好利用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
Run Code Online (Sandbox Code Playgroud)


vau*_*han 6

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

如果有foreign_key像这样的错误ActiveRecord::StatementInvalid (PG::FeatureNotSupported: ERROR: cannot truncate a table referenced in a foreign key constraint)

然后,CASCADE选项会有所帮助。

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


dev*_*voh 6

如果在应用程序或 rails 控制台中使用数据时只想删除数据而不触及表:

Rails.application.eager_load!
ActiveRecord::Base.connection.disable_referential_integrity do
  ApplicationRecord.descendants.each do |model|
    model.delete_all
  end
end
Run Code Online (Sandbox Code Playgroud)

使用此代码,您不必费心手动引用模型和/或外键约束(感谢 disable_referential_integrity)。
ApplicationRecord.descendants 只返回真正的应用程序模型,不像 ActiveRecord::Base.descendants(不再有 ApplicationRecord、schema_migrations 和 ar_internal_metadata)。


Ren*_*ene 5

这也将适用于Rails 4

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